使用FlexJSON,这很容易。它允许您创建可以包含/排除所需字段的JSONSerializer。
查看this article的一些使用Play的例子!框架。
这里有一个简单的例子:
public ComplexClass {
public Long id;
public String name;
// And lots of other fields you don't want
public String toJsonString() {
// Include id & name, exclude all others.
JSONSerializer ser = new JSONSerializer().include(
"id",
"name",
).exclude("*");
return ser.serialize(this);
}
}
你可以把它添加到您的dependencies.yml像这样:
require:
- play
- net.sf.flexjson -> flexjson 2.1
我最常做的是写模式,实现的接口我可以在控制器中调用renderJSON(someModel.toJSONString())
。
Link to official website
编辑:对列表/收藏
好吧,当你开始序列化列表中,您可能会得到一些意想不到的结果额外的例子。这是因为评估顺序很重要。第一个include()
或exclude()
优先于以下几个。
下面是序列化父实体的子对象(OneToMany关系)的示例。
JSONSerializer ser = new JSONSerializer();
// Exclude these standard fields from childs
ser.exclude(
"*.persistent",
"*.class",
"*.entityId"
);
// Include childs and all its other fields
ser.include(
"childs",
"childs.*"
);
// Exclude everything else
ser.exclude("*");
String data = ser.serialize(parent);
的*
是顺便说一个通配符。这篇文档很好地解释了它:
排除*.class
将匹配任何路径深度。因此,如果flexjson将该字段序列化为“foo.bar.class”的路径,则*.class
中的*
将与foo.bar匹配。
非常感谢你为你的优雅答案。我会试一试。 FlexJson听起来很好用,因为在相同的数据上创建多个视图要容易得多。 – huzeyfe 2012-03-12 09:13:55
顺便说一句,(如果可能的话)你能提供一些关于你的接口细节的细节,这样我也可以用这种方式在控制器中使用,因为我也需要序列化对象列表。 – huzeyfe 2012-03-12 12:24:49
更新了一个列表示例:) – maartencls 2012-03-13 12:58:56