2013-09-05 78 views
2

Play 2有沒有很好的解決方案來根據註釋獲取JSON的特定屬性?我想爲我的對象管理像我的例子那樣的東西。 我不想編碼每個對象的倍數特定編組器。json編組的全球解決方案Play Framework 2

public class User extends Models{ 
    @useForJson("all") 
    public Long id; 

    @useForJson("parse3") 
    public String email; 

    @useForJson("parse1","parse2") 
    public String firstName; 

    @useForJson("parse3","parse2") 
    public String lastName; 

    @userForJson("none") 
    public int age; 

} 
---------------> 
User user = new User(); 
Json json1 = user.toJson("parser1") // id, firstName 
Json json2 = user.toJson("parser2") // id, firstName, lastName 
Json json3 = user.toJson("parser3") // id, email, lastnName 
Json json4 = user.toJson() // id, email, firstName, lastName, age 

感謝您的提示!

回答

1

看起來你不想爲JSON指定一個解析器,而是一個序列化器,它將一個對象轉換成只有一些屬性的JSON。 Play使用傑克遜,因此該解決方案是使用傑克遜的觀點特點:org.codehaus.jackson.map.annotate.JsonView

它可以讓你選擇每個屬性的類,將採取行動,就像在你的榜樣了「parser1」字符串。在這裏使用類是一個不愉快的設計選擇,但據我所知,這是唯一的方法。

您可以通過擴展其他「視圖」類來構建某種層次結構。下面是一個例子,如何使用它,你應該找到一些更好的爲班級命名:沒有任何@JsonView

public class User extends Models { 

    public static class All { } 
    public static class View1 extends All { } 
    public static class View2 extends View1 { } 
    public static class View3 extends All { } 

    @JsonView(All.class) 
    public Long id; 

    @JsonView(View1.class) 
    public String email; 

    @JsonView({View2.class, View3.class}) 
    public String name; 

} 

屬性將被包含在任何視圖,所以All類可以在本例中被省略。

Play json api是一個太抽象的包裝來支持這個,你必須直接使用jackson。它也不會創建一個Json對象,但我確信這也是可能的。看看jackson api,可能有一些更優雅的方法來做到這一點。序列化這樣的對象:

ObjectMapper objectMapper = new ObjectMapper(); 
SerializationConfig cfg = 
    objectMapper.copySerializationConfig().withView(User.View2.class); 
objectMapper.setSerializationConfig(cfg); 
String json = objectMapper.writeValueAsString(user); 

如果你想解析JSON數據類似的東西,實際上只包含一些屬性,它可能是更容易使用org.codehaus.jackson.annotate.JsonIgnoreProperties和註釋你的類像這樣簡單地忽略性質不包含在序列化數據中:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class User extends Models { 
    // ... 
} 
+0

謝謝,Jackson帶JsonView註釋是我需要的! – gab

+1

使用新的傑克遜api播放2.2.x的調用會發生變化。看看文檔http://wiki.fasterxml.com/JacksonJsonViews – bopa

+0

看起來在Play 2.4中,你可以通過調用[play.libs.Json.mapper()]來訪問Play的「自己」ObjectMapper(https: //github.com/playframework/playframework/blob/2.4.0-M1/framework/src/play-json/src/main/java/play/libs/Json.java#L32)。 – mkurz