簡體   English   中英

傑克遜嵌入式Java對象的反序列化

[英]Jackson Deserialization of Embedded Java Object

我必須使用Jackson庫將json反序列化為Customer類

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

和類作為

class Address{
    String city;
    String street;
}

class Customer{
    String code;
    Address address;
}

我在堆棧Java jackson嵌入式對象反序列化中發現了類似的問題

但答案不適用於我的情況。 另外我只想使用傑克遜圖書館。

如何將此json映射到Customer對象?

您可以在客戶類的“ 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'}}

您需要的是自定義反序列化器。 Jackson How-To:定制反序列化器

對於您的用例,它可能是這樣的:

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);
  }
}

您的客戶JSON對象應如下所示:

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

如果沒有一些額外的轉換,這個json結構就不能映射到兩個類。 編寫將擁有json中所有三個字段的類CustomerAddress ,然后在其中創建Address getAddress()Customer getCustomer() ,或者轉換json以按照@eztam的建議將地址信息嵌套在customer字段中。

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());
  }
}

試試這個 !!!

{  
       "code":"customer1",
       "address":{  
          "type":"nested",
          "properties":{  
             "city":"Hyderabad",
             "street":"1000ftRoad"
          }
       }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM