2016-02-26 21 views
10

tôi phải deserialize json sau sử dụng thư viện Jackson vào lớp CustomerJackson Deserialization của Embedded Object Java

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

và lớp như

class Address{ 
    String city; 
    String street; 
} 

class Customer{ 
    String code; 
    Address address; 
} 

Tôi đã tìm thấy câu hỏi tương tự trên stack Java jackson embedded object deserialization

nhưng câu trả lời không áp dụng cho trường hợp của tôi. Ngoài ra tôi chỉ muốn sử dụng thư viện Jackson.

Tôi làm cách nào để ánh xạ json này với đối tượng Khách hàng?

+0

đã u thử lớp 'khách hàng mở rộng Address' và sau đó cung cấp loại khách hàng trong' objectmapper.getConstructType (Customer.Class) 'Object. điều này có thể giúp bạn .. không cố gắng nhưng đề nghị u theo kinh nghiệm của tôi .. Hy vọng điều này có thể làm việc .. –

Trả lời

5

Bạn có thể đặt một chú thích @JsonUnwrapped trên các lĩnh vực Address trong lớp khách hàng. Dưới đây là một ví dụ:

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

Output:

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

đối tượng JSON của bạn cho một khách hàng nên xem xét như thế này:

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

Cảm ơn bạn đã trả lời. Trên thực tế tôi có mã di sản mang lại cho tôi yêu cầu json như vậy. – vijay

+0

Ok, trong trường hợp này, bạn nên deserialize JSON của bạn trong một đối tượng Java phù hợp và chuyển đổi nó trong mã Java của bạn theo cách thủ công thành cấu trúc đối tượng yêu cầu như đề xuất bởi @Boris Pavlović – eztam

1

Nếu không có một số chuyển đổi thêm cấu trúc json này không thể được ánh xạ tới hai lớp. Hoặc viết một lớp CustomerAddress sẽ có tất cả ba trường từ json và sau đó tạo Address getAddress()Customer getCustomer() trong đó hoặc biến json để lồng thông tin địa chỉ bên trong trường khách hàng như được gợi ý bởi @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

Hãy thử cái này !!!

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

Điều bạn cần là trình giải mã tùy chỉnh. Jackson How-To: Custom Deserializers

Đối với trường hợp sử dụng của bạn nó có thể là một cái gì đó như thế này:

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); 
    } 
} 
Các vấn đề liên quan