Jackson反序列化嵌入式Java对象

11

我需要使用Jackson库将以下JSON反序列化为Customer类。

{
   "code":"C001",
   "city": "Pune",
   "street": "ABC Road"
}

以及类别作为

class Address{
    String city;
    String street;
}

class Customer{
    String code;
    Address address;
}

我在Stack Overflow上找到了一个类似的问题:Java jackson embedded object deserialization

但是答案并不适用于我的情况。 我只想使用Jackson库。

如何将此json映射到Customer对象?


你尝试过使用 class Customer extends Address,然后在 objectmapper.getConstructType(Customer.Class) 对象中提供客户类型吗?这可能会有所帮助,虽然我没有尝试过,但根据我的经验建议你尝试一下。希望能够解决你的问题。 - Vikrant Kashyap
5个回答

7
你可以在客户类的Address字段上放置一个@JsonUnwrapped注释。以下是示例:
public class JacksonValue {
    final static String JSON = "{\n"
            +"   \"code\":\"C001\",\n"
            +"   \"city\": \"Pune\",\n"
            +"   \"street\": \"ABC Road\"\n"
            +"}";

    static class Address {
        public String city;
        public String street;

        @Override
        public String toString() {
            return "Address{" +
                    "city='" + city + '\'' +
                    ", street='" + street + '\'' +
                    '}';
        }
    }

    static class Customer {
        public String code;
        @JsonUnwrapped
        public Address address;

        @Override
        public String toString() {
            return "Customer{" +
                    "code='" + code + '\'' +
                    ", address=" + address +
                    '}';
        }
    }


    public static void main(String[] args) throws IOException {
        final ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.readValue(JSON, Customer.class));
    }
}

输出:

 Customer{code='C001', address=Address{city='Pune', street='ABC Road'}}

2
你需要的是自定义反序列化器。对于你的使用情况,可以像这样实现:Jackson How-To: Custom Deserializers
class CustomerDeserializer extends JsonDeserializer<Customer>
{
  public Customer deserialize(JsonParser p, DeserializationContext ctxt) 
                                        throws IOException, JsonProcessingException
  {
    JsonNode node = p.getCodec().readTree(p);
    String code = node.get("code").asText();
    String city = node.get("city").asText();
    String street = node.get("street").asText();
    Address adr = new Address(city, street);
    return new Customer(code, adr);
  }
}

1
您的客户JSON对象应该是这样的:
{
   "code":"C001",
   "address":{
        "city": "Pune",
        "street": "ABC Road"
   } 
}

1
感谢您的回复。实际上,我有一些旧代码,它给我提供了这样的JSON请求。 - vijay
好的,在这种情况下,您应该将JSON反序列化成一个匹配的Java对象,并在Java代码中手动转换为所需的对象结构,就像@Boris Pavlović建议的那样。 - eztam

1

如果不进行额外的转换,这个JSON结构无法映射到两个类。可以编写一个名为CustomerAddress的类,该类将具有JSON中的所有三个字段,然后在其中创建getAddress()getCustomer()方法,或者按照@eztam的建议将地址信息嵌套在客户字段内。

public CustomerAddress {
  private String code;
  private String city;
  private String street;

  public Address getAddress() {
    return new Address(city, street);
  }

  public Address getCustomer() {
    return new Customer(code, this.getAddress());
  }
}

1
尝试这个!!!
{  
       "code":"customer1",
       "address":{  
          "type":"nested",
          "properties":{  
             "city":"Hyderabad",
             "street":"1000ftRoad"
          }
       }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接