我正在使用Jackson来编组对Web应用程序的json调用,并且我试图设计一种可以接受许多不同对象的方法。
例如:
我有两个班级结构
{
name:"Joe",
surname:"Bloggs"
}
对应于Java类Person
{
address1:"21 Main st",
city:"Georgetown",
zip:"12345"
}
对应于java类地址
现在,我想进行一次调用,以这种方式处理这些类中的任何一个:
{
type:"Person",
data:{
name:"Joe",
surname:"Bloggs"
}
}
我可以创建一个将上述请求封送给Map的调用,也可以创建两个单独的请求,每个请求针对一个对象结构并将其直接封送给相应的类。
是否可以使用Jackson来将上述请求封送给Map,然后在读取了地图的一部分(例如map.get(“ type”))之后,使用Jackson来封送一个子对象-例如map.get (“ data”)-转换为相应的Java类,而无需重新转换回json?
您可以使用Jackson多态性。这是一个简单的例子:
public class Polymorphism3Main {
public static void main(String []args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(generatePerson());
System.out.println("json = " + json);
System.out.println(objectMapper.readValue(json, Request.class));
json = objectMapper.writeValueAsString(generateAddress());
System.out.println("json = " + json);
System.out.println(objectMapper.readValue(json, Request.class));
}
private static Person generatePerson() {
Person result = new Person();
result.setName("name");
result.setSurname("surname");
return result;
}
private static Address generateAddress() {
Address address = new Address();
address.setAddress1("address 1");
address.setCity("city");
address.setZip("324212");
return address;
}
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(value = Person.class, name = "person"),
@JsonSubTypes.Type(value = Address.class, name = "address")
})
interface Request {
}
class Person implements Request {
private String name;
private String surname;
}
class Address implements Request {
private String address1;
private String city;
private String zip;
}
该代码将产生略有不同的json,但仍然可以使用:
{"person":{"name":"name","surname":"surname"}}
{"address":{"address1":"address 1","city":"city","zip":"324212"}}
如果您希望使用与发布时完全相同的json格式,则需要创建一个包装器对象。
通常,我建议创建两个单独的方法来不同地处理这两个请求。在这种情况下,您的代码将更加简洁,您无需通过Request界面将Person和Address结合使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句