我有一个类似的模型:
SomeModel
public Long id;
public String name;
public Integer age;
public String address;
public Profile profile;
在我的模板中,我想渲染一个更简单的模型版本,只有id和name。
如果我Json.toJson(SomeModel.find.findList());
,它将在数据库中呈现SomeModels
的列表,但是使用完整的表单。
我编写了一个只返回id和name的Serializer,但是如何告诉Json.toJson
使用此序列化程序?
public class SimpleSomeModelSeralizer extends JsonSerializer<SomeModel> {
@Override
public void serialize(SomeModel someModel, JsonGenerator generator, SerializerProvider serializer) throws IOException,JsonProcessingException {
if (someModel == null) return;
generator.writeStartObject();
generator.writeNumberField("id", someModel.getId());
generator.writeStringField("name", someModel.getName());
generator.writeEndObject();
}
}
我看过Play中的代码,当然,toJson是一个简单的版本,不需要一些序列化程序作为参数,所以我想我必须写一个更长的代码,但我不知道什么/怎么做。
Json.toJson游戏中的代码:
public static JsonNode toJson(final Object data) {
try {
return new ObjectMapper().valueToTree(data);
} catch(Exception e) {
throw new RuntimeException(e);
}
}
有可能做这样的事吗? :
new ObjectMapper().useSerializer(SimpleSomeModelSeralizer.class).valueToTree(SomeModel.find.findList());
感谢您的帮助!
答案 0 :(得分:0)
好的,这就是我的所作所为。在SomeModel类中,我添加了一个静态方法,将列表作为JsonNode返回,我只是从我的模板中调用它:
public static JsonNode findItemsAsJson() {
ObjectMapper mapper = new ObjectMapper();
SimpleModule someModelModule = new SimpleModule("SomeModel", new Version(1, 0, 0, null));
someModelModule.addSerializer(SomeModel.class, new SimpleSomeModelSeralizer());
mapper.registerModule(someModelModule);
return mapper.valueToTree(SomeModel.find.findList());
}
此方法的缺点是您绑定到硬编码的查询(SomeModel.find.findList()
),但您可以轻松地向该查询的方法添加参数:
public static JsonNode findItemsAsJson(Query<SomeModel> query) {
ObjectMapper mapper = new ObjectMapper();
SimpleModule someModelModule = new SimpleModule("SomeModel", new Version(1, 0, 0, null));
someModelModule.addSerializer(SomeModel.class, new SimpleSomeModelSeralizer());
mapper.registerModule(someModelModule);
return mapper.valueToTree(query.findList());
}
你用它来称呼它:
SomeModel.findItemsAsJson(SomeModel.find.like("name", "B%").query());
希望它会有所帮助:)