Jackson @JsonProperty(required = true)不会抛出异常

jak*_*sky 41 java json jackson

我正在使用jackson 2.2注释@JsonProperty,必需的设置为true.通过ObjectMapper readValue()方法反序列化不包含该属性的json文件时,不会抛出任何异常.是应该以不同的方式工作还是我错过了什么?

我的课程:

public class User {
    public enum Gender {MALE, FEMALE}

    ;

    public static class Name {
        private String _first, _last;

        public String getFirst() {
            return _first;
        }

        public String getLast() {
            return _last;
        }

        public void setFirst(String s) {
            _first = s;
        }

        public void setLast(String s) {
            _last = s;
        }
    }

    private Gender _gender;
    private Name _name;
    private boolean _isVerified;
    private byte[] _userImage;

    @JsonProperty(value ="NAAME",required = true)
    public Name getName() {
        return _name;
    }

    @JsonProperty("VERIFIED")
    public boolean isVerified() {
        return _isVerified;
    }

    @JsonProperty("GENDER")
    public Gender getGender() {
        return _gender;
    }
    @JsonProperty("IMG")
    public byte[] getUserImage() {
        return _userImage;
    }

    @JsonProperty(value ="NAAME",required = true)
    public void setName(Name n) {
        _name = n;
    }
    @JsonProperty("VERIFIED")
    public void setVerified(boolean b) {
        _isVerified = b;
    }
    @JsonProperty("GENDER")
    public void setGender(Gender g) {
        _gender = g;
    }
    @JsonProperty("IMG")
    public void setUserImage(byte[] b) {
        _userImage = b;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我如何反序列化类:

public class Serializer {
    private ObjectMapper mapper;

    public Serializer() {
        mapper = new ObjectMapper();
        SimpleModule sm = new SimpleModule("PIF deserialization");
        mapper.registerModule(sm);
    }

    public void writeUser(File filename, User user) throws IOException {
        mapper.writeValue(filename, user);
    }

    public User readUser(File filename) throws IOException {
          return mapper.readValue(filename, User.class);
      }
}
Run Code Online (Sandbox Code Playgroud)

这就是实际调用的方式:

    Serializer serializer = new Serializer();
    User result = serializer.readUser(new File("user.json"));
Run Code Online (Sandbox Code Playgroud)

Actuall json看起来像:

{"GENDER":"FEMALE","VERIFIED":true,"IMG":"AQ8="}
Run Code Online (Sandbox Code Playgroud)

我希望由于_name未在json文件中指定,并且要求抛出异常.

Sta*_*Man 26

根据Jackson注释javadocs:"请注意,从2.0开始,BeanDeserializer不使用此属性:预计将为稍后的次要版本添加支持."

即:使用此设置不执行验证.它(仅)(当前)用于生成JSON模式或自定义代码.


Boj*_*vic 18

使用Jackson 2.6,您可以使用必需的,但您必须使用JsonCreator

例如:

public class MyClass {

    @JsonCreator
    public MyClass(@JsonProperty(value = "x", required = true) Integer x, @JsonProperty(value = "value_y", required = true) Integer y) {
        this.x = x;
        this.y = y;
    }

    private Integer x;
    private Integer y;
}
Run Code Online (Sandbox Code Playgroud)

如果x或y不存在,则在尝试反序列化时将抛出异常.

  • 但是(无论如何,对于Jackson 2.6.5而言),如果您的JSON将x分配为“ null”,那么Jackson将欣然接受此为有效。 (2认同)
  • @fragorl 我认为这是预期的行为。重点不是说它必须是非空的,只是它必须是 _provided_。如果你提供了它,但你提供了 null,那就是给出了。然后您需要进行更多验证以确保您没有无效数据(例如空值) (2认同)