0

我正在使用 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());  

但我想手动构建这个数组,而不是仅仅调用序列化。假设盎司数低于某个数字,那么这应该会改变 css 列的值。css 列不是对象(模型)的一部分,所以我也需要手动添加它。谢谢。

4

1 回答 1

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

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

于 2011-06-13T17:29:50.417 回答