如何逐行构建JSON数组(遍历列表)。 FlexJSON

时间:2011-06-05 23:14:16

标签: java json playframework flexjson

我正在使用FlexJSON(但我对其他库开放),我想手动构建一个json数组。我有一些我需要添加的东西,它们不是被序列化的模型的一部分。例如,我想在我的json数组中添加一个html列和css列。这些数据将通过迭代列表并查看值是高于还是低于某个数字来确定。

现在我就是这个。

   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 个答案:

答案 0 :(得分: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,
        ...
    }
}

数据指向模型对象,因此它从根目录下降到一个级别。这个选项将消耗更多的内存,并且需要更多的结构(也就是更多的类来编写)才能工作,所以如果是我的话,我更喜欢第一个选项。