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
感谢您的提示!
答案 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 {
// ...
}