我正在使用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列不是object(model)的一部分,因此我也需要手动添加。谢谢。

最佳答案

Flexjson和其他JSON序列化库均使用模型的结构作为指导,因此当模型具有要放入JSON的数据时,它们会发挥最佳作用。 Flexjson将在序列化过程中使用属性方法(getter / setter)。因此,如果您想像您所说的那样添加计算,则可以添加getCssColumn()属性方法,Flexjson会将其视为任何旧属性:

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


因此,您可以根据需要向对象添加任意数量的这些方法,它将对它们进行序列化,就像它们是对象上的实际实例变量一样。就像您正在寻找的那样,这是一个将计算值呈现到JSON输出中的好技巧。

如果您不喜欢那样,那么我建议您创建一个包装对象,该对象包装模型对象,以跟踪要添加到模型中的数据。您必须在JSON输出上保持灵活性,但可以在其周围包装值。您可能最终会遇到这样的事情:

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


数据指向模型对象的位置,因此它在根的下方。该选项将消耗更多的内存,并且需要更多的结构(也可以编写更多的类)来工作,所以如果我是第一个选择,我会更喜欢。

09-04 16:43