Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用jackson解码json时的验证_Java_Json_Jackson - Fatal编程技术网

Java 使用jackson解码json时的验证

Java 使用jackson解码json时的验证,java,json,jackson,Java,Json,Jackson,我收到一个json编码的字符串,然后将其解码为pojo,如下所示: String json = ... final ObjectMapper mapper = new ObjectMapper(); MyPojo obj = mapper.readValue(json, MyPojo.class); @JsonIgnoreProperties(ignoreUnknown=true) class MyPojo { public static enum Type { O

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

String json = ...

final ObjectMapper mapper = new ObjectMapper();
MyPojo obj  = mapper.readValue(json, MyPojo.class);
@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;
    }
}
我希望能够验证此输入,但我不确定“正确方式”是什么。
假设MyPojo的定义如下:

String json = ...

final ObjectMapper mapper = new ObjectMapper();
MyPojo obj  = mapper.readValue(json, MyPojo.class);
@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;
    }
}
我想验证三件事:

  • 所有成员都有价值观
  • 枚举值是枚举的一部分
  • 根据某些标准测试某些或所有值(即:最小或最大长度、最小或人数值、正则表达式等)
  • 如果验证失败,我希望返回一条有意义且可读的消息

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

    至于第二个问题,如果输入中的值与某个枚举值不匹配,则会抛出一个
    JsonMappingException
    ,因此我设法做到了这一点:

    try {
        MyPojo obj  = mapper.readValue(json, MyPojo.class);
    }
    catch (JsonMappingException e) {
        return "invalid value for property: " + e.getPath().get(0).getFieldName();
    }
    
    但是如何在输入中获取值,以便返回:
    无效值:property的值:property


    谢谢。

    我建议使用的实现。此规范定义了一组注释和XML配置文件,用于指定要在域对象上验证的约束。此处提供了参考实施:


    谢谢,这看起来很有趣,我会去看看,但这不是我想要的。。。我想知道是否有一种方法至少可以验证我发布的前两个问题。