如何为对象指示特定的Serializer?

时间:2013-03-11 11:07:06

标签: json playframework-2.1

我有一个类似的模型:

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());

感谢您的帮助!

1 个答案:

答案 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());

希望它会有所帮助:)