Как строить массив JSON построчно (перебирать список).FlexJSON - PullRequest
0 голосов
/ 06 июня 2011

Я использую 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());  

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

1 Ответ

1 голос
/ 13 июня 2011

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-й вариант, если это был я.

...