我正在使用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列不是对象(模型)的一部分,所以我也需要手动添加它。感谢。
答案 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,
...
}
}
数据指向模型对象,因此它从根目录下降到一个级别。这个选项将消耗更多的内存,并且需要更多的结构(也就是更多的类来编写)才能工作,所以如果是我的话,我更喜欢第一个选项。