2013-12-14 16 views
14

Trong ví dụBỏ qua thiếu tính trong jackson json deserialize trong java

Class Person{ 
    String name; 
    int age; 
} 

Nếu đối tượng json có một tài sản mất tích 'tuổi',

{ 
    name : John 
} 

Person person = objectMapper.readValue(jsonFileReader, Person.class); 

nó ném một JsonMappingException nói rằng nó không thể deserialize. Có chú thích nào để bỏ qua các trường bị thiếu trong quá trình deserialization không?

Cảm ơn

+0

Vui lòng đăng theo dõi ngăn xếp đầy đủ. –

Trả lời

23

Tôi nghĩ rằng những gì bạn muốn là

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) 
public class Person { 
    ... 
} 

đó là 1.x cách Jackson. Tôi nghĩ rằng có một cách mới trong 2.x. Một cái gì đó như

@JsonInclude(Include.NON_NULL) 
public class Person { 
    ... 
} 

Điều này sẽ chỉ cho Jackson chỉ sắp xếp các giá trị không rỗng và không phàn nàn khi deserializing một giá trị còn thiếu. Tôi nghĩ rằng nó sẽ chỉ đặt nó vào mặc định Java.

2

Tôi nghĩ rằng bạn sẽ muốn sử dụng các chú thích @JsonIgnore: http://jackson.codehaus.org/1.0.1/javadoc/org/codehaus/jackson/annotate/JsonIgnore.html

+1

Tài liệu đã được chuyển đến http://fasterxml.github.io/jackson-annotations/javadoc/2.0.2/com/fasterxml/jackson/annotation/JsonIgnore.html –

+0

Diễu hành không thể tránh khỏi về thời gian và bản phát hành đã hiển thị liên kết của @ MagnusReftel bị hỏng (vì chúng dường như không giữ javadocs cho các phiên bản cũ hơn). Liên kết được cập nhật là https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonIgnore.html –

+0

Không '@ JsonIgnore' hướng dẫn Jackson loại trừ hoàn toàn thuộc tính trong cả hai serialization và deserialization? – Yoshiya

35

@JsonIgnoreProperties(ignoreUnknown = true) vào mức độ lớp làm việc cho tôi

cách tiếp cận
+0

Điều này đang hoạt động nhưng ở mức cao hơn. Cẩn thận vì nó ngăn hệ thống kích hoạt một ngoại lệ trong trường hợp tham số json "không khớp". – Tobliug

7

Chú dựa là một cách tốt hơn cho bỏ qua nhưng nếu cần thiết. Cách thủ công của quá trình deserialization:

ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
Person  person = mapper.readValue(jsonFileReader, Person.class); 
+0

Bạn có nhớ giải thích cách tiếp cận dựa trên chú thích _why_ tốt hơn "cách thủ công" không? – jayeffkay

+1

@jayeffkay Nói chung, chỉ tập trung vào Pojo thay vì logic deserialization là cách ưa thích. Bạn có thể xem xét nó giống như việc tạo một kết nối JDBC theo cách thủ công với các thực thể ORM. Nhưng nếu bạn muốn có một giải pháp tùy chỉnh. Cách thủ công được chào đón. –

Các vấn đề liên quan