Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Serialization Jackson注释:JsonIgnoreProperties(ignoreUnknown=true)和JsonInclude(Include.NON_EMPTY)之间的差异_Serialization_Jackson_Deserialization - Fatal编程技术网

Serialization Jackson注释:JsonIgnoreProperties(ignoreUnknown=true)和JsonInclude(Include.NON_EMPTY)之间的差异

Serialization Jackson注释:JsonIgnoreProperties(ignoreUnknown=true)和JsonInclude(Include.NON_EMPTY)之间的差异,serialization,jackson,deserialization,Serialization,Jackson,Deserialization,我很好奇,Jackson注释@JsonIgnoreProperties(ignoreUnknown=true)和@JsonInclude(Include.NON_EMPTY)在类级别上有什么区别吗?一个只是另一个的更新版本吗?谢谢 缔约国指出: ignoreUnknown属性,定义是否可以忽略 反序列化期间任何无法识别的属性 这与空属性相同吗?简短回答: @JsonIgnoreProperties(ignoreUnknown=true)仅适用于将JSON反序列化为Java对象(POJO)。如果您

我很好奇,Jackson注释@JsonIgnoreProperties(ignoreUnknown=true)和@JsonInclude(Include.NON_EMPTY)在类级别上有什么区别吗?一个只是另一个的更新版本吗?谢谢

缔约国指出:

ignoreUnknown属性,定义是否可以忽略 反序列化期间任何无法识别的属性

这与空属性相同吗?

简短回答:

  • @JsonIgnoreProperties(ignoreUnknown=true)
    仅适用于将JSON反序列化为Java对象(
    POJO
    )。如果您的POJO不包含JSON确实包含的某些属性,那么将忽略它们,并且不会抛出任何错误
  • 另一方面,
    @JsonInclude(Include.NON_EMPTY)
    用于将POJO序列化为JSON,它表示跳过以下POJO属性:

    不包括null或被视为空的内容。定义 空是特定于数据类型的

  • 长答覆:

    @JsonInclude

    它仅在序列化时使用。它表示,如果所讨论的某个属性(或所有属性)的值等于某个值(
    null
    empty
    -无论这意味着什么,或默认值),则此属性不会序列化

    如果没有此注释,属性值总是序列化的。注释有助于减少传输属性的数量(当接收端不存在属性默认值时,必须指定属性默认值)

    例如:

    public class Person {
        public String firstName = "Mark";
        public String middleName;
        public String lastName = "Watney";
    }
    
    ObjectMapper mapper = new ObjectMapper();
    Person p = new Person();
    System.out.println(mapper.writeValueAsString(p));
    
    产生以下输出:

    {"firstName":"Mark", "middleName":null, "lastName":"Watney"}
    
    但是如果用
    @JsonInclude(Include.NON_EMPTY)
    注释
    Person
    ,则从输出中忽略
    middleName
    ,因为其值为“空”(
    null
    ):

    控制台输出为:
    {“firstName”:“Mark”,“lastName”:“Watney”}

    @JsonIgnoreProperties

    用于忽略序列化和反序列化中的某些属性,而不考虑其值:

    要防止对指定字段进行序列化或反序列化(即不包括在JSON输出中;或者即使包含也不设置这些字段):
    @JsonIgnoreProperties({“internalId”,“secretKey”})

    要毫无例外地忽略JSON输入中的任何未知属性:
    @JsonIgnoreProperties(ignoreUnknown=true)

    如果JSON输入为:

    {
        "firstName": "Homer",
        "middleName": "Jay",
        "lastName": "Simpson"
    }
    
    课程是:

    public class Person {
        public String firstName;
        public String lastName;
    }
    
    反序列化
    mapper.readValue(json,Person.class)
    将产生
    无法识别的属性异常
    异常:

    线程“main”中出现异常 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 无法识别的字段“middleName”

    因为属性
    middleName
    不属于
    Person

    但是如果用
    @JsonIgnoreProperties(ignoreUnknown=true)
    注释类
    Person
    ,则在反序列化到POJO时将忽略未知属性(如
    middleName

    @JsonIgnoreProperties(ignoreUnknown=true)
    public class person {
        [...]
    }
    
    另一个常见用例是禁止敏感属性的序列化,例如密码:

    @JsonIgnoreProperties("password")
    public static class User {
        public String login = "simpsonh";
        public String password = "D00nut";
        public String firstName = "Homer";
        public String middleName = "Jay";
        public String lastName = "Simpson";
    }
    
    现在,如果序列化用户类,则输出中将忽略密码:

    User u = new User();
    System.out.println(mapper.writeValueAsString(u));
    
    控制台输出:

    {
        "login":"simpsonh",
        "firstName":"Homer",
        "middleName":"Jay",
        "lastName":"Simpson"
    }
    

    多好的回答啊。谢谢你这么彻底!有趣的是,他们决定使用JsonInclude的名称将其从结果json中排除name@Sebastian-像这样读取->反序列化时,仅包括非空字段。
    {
        "login":"simpsonh",
        "firstName":"Homer",
        "middleName":"Jay",
        "lastName":"Simpson"
    }