2013-09-05 79 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