2012-07-06 78 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