Как построить массив JSON построчно (перебирать список). FlexJSON

Я использую FlexJSON (но я открыт для других библиотек) и хочу вручную создать массив json. У меня есть некоторые вещи, которые мне нужно добавить, которые не являются частью сериализуемой модели. Например, я хочу добавить столбец html и столбец css в свой массив json. Эти данные будут определяться путем повторения списка и проверки того, находятся ли значения выше или ниже определенного числа.

Сейчас у меня как раз это.

   JSONSerializer json = new JSONSerializer();
    json.transform(new DateTransformer("MM/dd/yyyy hh:mm:ss"), "timeStamp");
    json.transform(new DecimalTransformer("#.00") , "ounces");
    json.include("timeStamp", "ounces");
    json.exclude("*");
    json.prettyPrint(true);

    response.setContentTypeIfNotSet("application/json");
    response.out.write(json.serialize(list).getBytes());  

Но я хочу вручную построить этот массив, а не просто вызывать сериализацию. Скажем, количество унций ниже определенного числа, тогда это должно изменить значение столбца css. Столбец css не является частью объекта (модели), поэтому мне нужно добавить его вручную. Спасибо.


person Drew H    schedule 05.06.2011    source источник
comment
Звучит так, как будто вы просто хотите настроить сериализацию объекта. Взгляните на этот пост, так как он может решить вашу проблему...stackoverflow.com/questions/4522169/   -  person Codemwnci    schedule 06.06.2011


Ответы (1)


Flexjson и другие библиотеки сериализации JSON используют структуру модели в качестве руководства, поэтому они работают лучше всего, когда модель содержит данные, которые вы хотите поместить в JSON. Flexjson будет использовать методы свойства (getter/setter) во время сериализации. Итак, если вы хотите добавить вычисления, подобные тому, что вы говорили, вы можете добавить метод свойства getCssColumn(), и Flexjson будет рассматривать его как любое старое свойство:

public String getCssColumn() {
   return ounces < SOME_THRESHOLD ? "tooSmall" : "justRight";
}

Таким образом, вы можете добавить к своему объекту столько этих методов, сколько захотите, и он будет сериализовать их так же, как они были фактическими переменными экземпляра вашего объекта. Это хороший трюк для вывода вычисленных значений в ваш вывод JSON именно так, как вы ищете.

Если вам это не нравится, я бы предложил создать объект-оболочку, который обертывает объект вашей модели, чтобы отслеживать данные, которые вы хотите добавить в модель. Вы должны быть гибкими в выводе JSON, но вы можете обернуть вокруг него значения. Вы просто можете получить что-то вроде этого:

{
    "cssColumn": "justRight",
    ...
    "data": {
        "ounces": 45,
        ...
    }
}

Если данные указывают на объект вашей модели, следовательно, он находится на уровне ниже корня. Этот вариант будет потреблять немного больше памяти и потребует немного больше структуры (то есть больше классов для написания), поэтому я бы предпочел 1-й вариант, если бы это был я.

person chubbsondubs    schedule 13.06.2011