2012-07-06 36 views
5

tôi nhận được một chuỗi json mã hóa và sau đó tôi giải mã nó thành một POJO, như thế này:Validation khi giải mã json sử dụng jackson

String json = ... 

final ObjectMapper mapper = new ObjectMapper(); 
MyPojo obj = mapper.readValue(json, MyPojo.class); 

Tôi muốn để có thể xác nhận đầu vào này, nhưng tôi không chắc chắn những gì là "đúng cách" làm việc đó.
Hãy nói rằng MyPojo được định nghĩa như thế này:

@JsonIgnoreProperties(ignoreUnknown=true) 
class MyPojo { 
    public static enum Type { 
     One, 
     Two, 
     Three; 

     @JsonValue 
     public String value() { 
      return this.name().toLowerCase(); 
     } 
    } 

    private String id; 
    private Type type; 
    private String name; 

    public String getId() { 
     return this.id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public Type getType() { 
     return this.type; 
    } 

    public void setType(Type type) { 
     this.type = type; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

Có ba điều tôi muốn xác nhận:

  1. Đó là tất cả các thành viên có giá trị
  2. Đó là giá trị enum là một phần thuộc kiểu liệt kê
  3. Kiểm tra một số hoặc tất cả các giá trị dựa trên một số tiêu chí (ví dụ: độ dài tối thiểu hoặc tối đa, giá trị số phút hoặc số người, cụm từ thông dụng, v.v.)

Nếu xác thực không thành công, tôi muốn trả lại một thông báo có ý nghĩa và có thể đọc được. Đối với các vấn đề đầu tiên và thứ ba, tôi có thể chỉ cần kiểm tra tất cả các thành viên của đối tượng và xem có bất kỳ thành viên nào không và nếu không kiểm tra chúng theo tiêu chí, nhưng cách tiếp cận này có thể dài và phức tạp khi có nhiều trường.

Đối với vấn đề thứ 2, nếu giá trị trong đầu vào không phù hợp với một trong các giá trị liệt kê sau đó một JsonMappingException được ném ra, và vì vậy tôi cố gắng làm điều này:

try { 
    MyPojo obj = mapper.readValue(json, MyPojo.class); 
} 
catch (JsonMappingException e) { 
    return "invalid value for property: " + e.getPath().get(0).getFieldName(); 
} 

Nhưng làm thế nào để tôi nhận được giá trị trong đầu vào để tôi có thể quay lại: invalid value: VALUE for property: PROPERTY?

Cảm ơn.

Trả lời

1

Tôi khuyên bạn nên sử dụng triển khai JSR-303 Bean Validation. Đặc tả này định nghĩa một tập hợp các chú thích và các tệp cấu hình XML để xác định các ràng buộc mà bạn muốn xác thực trên miền của bạn. Việc thực hiện tài liệu tham khảo có sẵn ở đây:

+1

Cảm ơn, điều này có vẻ thú vị và tôi sẽ kiểm tra xem nó ra, nhưng nó không phải là chính xác những gì tôi đang tìm kiếm ... Tôi tự hỏi nếu có một jackson cách ít nhất là xác nhận 2 vấn đề đầu tiên tôi đã đăng. –

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