使用json编组Play Framework 2的全局解决方案

时间:2013-09-05 17:41:19

标签: json playframework-2.0 jackson marshalling

Play 2有什么好的解决方案可以根据注释获取JSON的特定属性吗?我想管理我的对象,就像我的例子。 我不想为每个对象编码多次特定的编组。

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 个答案:

答案 0 :(得分:1)

看起来您不希望为JSON指定解析器,而是指定序列化程序,它将对象转换为仅包含其某些属性的JSON。 Play使用Jackson,所以解决方案是使用jackson的视图功能:org.codehaus.jackson.map.annotate.JsonView

它将允许您为每个属性选择一个类,它将像您示例中的“parser1”字符串一样。这里的类的使用是一个令人不快的设计选择,但据我所知,这是唯一的方法。

您可以通过扩展其他“视图”类来构建某种层次结构。以下是如何使用它的示例,您应该可以找到更好的类命名:

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;

}

没有任何@JsonView的属性将包含在任何视图中,因此示例中可以省略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 {
    // ...
}