2012-07-06 79 views
5

我收到一個JSON編碼字符串,然後我把它解碼成一個POJO,像這樣JSON時:驗證解碼使用傑克遜

String json = ... 

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

我希望能夠驗證此輸入,但我不知道做這件事的「正確方法」是什麼?
比方說MyPojo這樣定義:

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

有我想驗證三件事情:

  1. 所有成員都值
  2. 這枚舉值是枚舉
  3. 的一部分
  4. 根據某些標準測試部分或全部值(例如:最小或最大長度,最小或人數值,正則表達式等)

如果驗證失敗,我想返回一個有意義且可讀的消息。

對於第一個和第三個問題,我可以簡單地檢查對象的所有成員,看看是否有空,如果沒有按照標準對它們進行測試,但是當有許多字段時,這種方法可能會變得漫長而複雜。

至於第二個問題,如果輸入的值不匹配的枚舉值則JsonMappingException被拋出的一個,所以我成功地做到這一點:

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

但我怎麼得到在輸入值中,我可以返回:invalid value: VALUE for property: PROPERTY

謝謝。

回答

1

我會推薦使用JSR-303 Bean Validation的實現。此規範定義了一組註釋和XML配置文件,用於指定您希望驗證您的域對象的約束。參考實現可以在這裏找到:

+1

謝謝,這看起來很有趣,我會檢查出來,但它不正是我一直在尋找的......我不知道是否有傑克遜至少驗證我發佈的前兩個問題。 – 2012-07-06 13:37:18