与杰克逊编组地图对象

铜镍

我正在使用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?

伊利亚·奥维斯诺夫(Ilya Ovesnov)

您可以使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章