2

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

感谢您的提示!

4

1 回答 1

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。它也不会创建一个 play 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 {
    // ...
}
于 2013-09-07T17:10:50.957 回答