0

我有一个模型:

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 的序列化器,但是我怎么知道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());
4

1 回答 1

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

希望它会有所帮助:)

于 2013-03-11T12:39:11.747 回答