2013-03-11 30 views
0

我有這樣一個模型:如何爲對象指定特定的串行器?

SomeModel 
    public Long id; 
    public String name; 
    public Integer age; 
    public String address; 
    public Profile profile; 

在我的模板,我想使這個模型中,只有ID和名稱的簡化版本。

如果我這樣做Json.toJson(SomeModel.find.findList());它將呈現數據庫中的SomeModels列表,但具有完整的表單。

我已經寫了一個序列化器,它只是返回ID和名稱,但我怎麼能告訴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(); 
    } 

} 

我看着在遊戲代碼,當然,的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

好吧,這就是我所做的。在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()); 

希望能對大家有所幫助:)

相關問題