2015-06-17 24 views
5

Tôi có một lược đồ JSON và một chuỗi json khớp với lược đồ, ngoại trừ nó có thể có thêm một vài trường. Jackson sẽ ném một ngoại lệ nếu những lĩnh vực đó có nếu tôi không thêm objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);. Có cách nào để có được một bộ sưu tập của những lĩnh vực phụ để đăng nhập chúng, ngay cả khi tôi ném một ngoại lệ?Lấy danh sách các trường không xác định từ Jackson

Dưới đây là các bit tương ứng của mã:

public boolean validate(Message<String> json) { 
    List<String> errorList = jsonSchema.validate(json.getPayload()); 
    ObjectMapper mapper = new ObjectMapper(); 
    try { 
     Update update = mapper.readValue(json.getPayload(), Update.class); 
    } catch (IOException e) { 
     System.out.println("Broken"); 
    } 
    if(!errorList.isEmpty()) { 
     LOG.warn("Json message did not match schema: {}", errorList); 
    } 
    return true; 
} 

Trả lời

6

Tôi không nghĩ rằng có như vậy một lựa chọn ra khỏi hộp.

Tuy nhiên, bạn có thể giữ các trường chưa được xuất bản này với @JsonAnyGetter và @JsonAnySetter trong bản đồ (Hashmap, Treemap) như được minh họa trong this articlethis one.

Thêm phần này vào lớp Cập nhật của bạn:

private Map<String, String> other = new HashMap<String, String>(); 

    @JsonAnyGetter 
    public Map<String, String> any() { 
    return other; 
    } 

@JsonAnySetter 
    public void set(String name, String value) { 
    other.put(name, value); 
    } 

Và bạn có thể ném một ngoại lệ cho mình nếu danh sách trường bổ sung là không có sản phẩm nào. Các phương pháp để kiểm tra xem:

public boolean hasUnknowProperties() { 
    return !other.isEmpty(); 
    } 
+0

Sự cố là lớp Cập nhật được tạo tự động, vì vậy mọi thứ tôi thêm vào sẽ bị xóa. Bất kỳ ý tưởng nào khác? – Tavo

+2

@Tavo Mở rộng lớp Cập nhật. –

2

Nếu bạn chỉ muốn biết những gì thuộc tính chưa được biết đầu tiên (tên) là, tôi nghĩ rằng ngoại trừ bạn nhận được không có tham chiếu đến tên tài sản. Bạn sẽ không thể nhận thêm thông tin kể từ khi xử lý các điểm dừng tại thuộc tính không xác định đầu tiên (hoặc, nếu bỏ qua, giá trị đó bị bỏ qua).

Sử dụng @JsonAnySetter được đề xuất là một lựa chọn tốt.

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