2011-06-05 74 views
0

我正在使用FlexJSON(但我打开其他库),我想手动构建一个json数组。我需要添加一些不属于正在序列化的模型的部分内容。例如,我想添加一个html列和css列到我的json数组中。这些数据将通过遍历列表来确定,并查看这些值是高于还是低于某个数字。如何逐行建立JSON数组(遍历列表)。 FlexJSON

现在我只是有这个。

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列不是对象(模型)的一部分,所以我需要手动添加。谢谢。

+0

听起来好像你只是想自定义对象的序列化。看看这个帖子,因为它可能会解决你的问题... http://stackoverflow.com/questions/4522169/customizing-json-serialization-in-play – Codemwnci 2011-06-06 08:15:34

回答

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, 
     ... 
    } 
} 

其中数据指向你的模型对象,因此它是从根层下来的。这个选项将消耗更多的内存,并且需要更多的结构(也可以写更多类)来工作,所以如果是我,我更喜欢第一个选项。