使用jackson解码json时的验证

时间:2012-07-06 12:21:21

标签: java json jackson

我收到一个json编码的字符串,然后我将其解码为pojo,如下所示:

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. 如果验证失败,我想返回一条有意义且可读的消息。

    对于第一个和第三个问题,我可以简单地检查对象的所有成员,看看是否有空,如果没有根据标准测试它们,但是当有许多字段时,这种方法会变得冗长而复杂。 / p>

    至于第二个问题,如果输入中的值与其中一个枚举值不匹配,则会抛出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 个答案:

答案 0 :(得分:1)

我建议使用JSR-303 Bean Validation的实现。此规范定义了一组注释和XML配置文件,用于指定您希望在域对象上验证的约束。参考实现可在此处获得: