https://www.cnblogs.com/klhans/p/12583751.html

不同JSON工具注意点

常用的 JSON 工具有 Jackson、fastjson、hutool 等,下面简单举例示范一下区别

  1. jackson: @JsonProperty 按照属性的定义顺序排序 (反序列化时无参构造(default constructor)必须存在)
  2. fastjson: @JSONField 按照属性的首字母排序
  3. hutool: @Alias 按照属性的定义顺序排序

    1. @Test
    2. public void test() {
    3. DataInfo info = new DataInfo("zhangsan", "001");
    4. System.out.println(JSON.toJSONString(info));
    5. System.out.println(JSONUtil.toJsonStr(info));
    6. System.out.println(JacksonUtils.toJson(info));
    7. System.out.println();
    8. String jsonInfo = "{\"Code\":\"001\", \"Name\":\"zhangsan\"}";
    9. System.out.println(JSONObject.parseObject(jsonInfo, DataInfo.class));
    10. System.out.println(JSONUtil.toBean(jsonInfo, DataInfo.class));
    11. System.out.println(JacksonUtils.toObj(jsonInfo, DataInfo.class));
    12. }

序列化规则

public 修饰的字段序列化时会直接读取字段值,不需要有 get 方法。如果有 get 方法的话,以 get 方法返回的字段值优先。
默认情况下其他访问权限的属性没有 get 方法的话不会参与序列化。
序列化的字段名命名规则是类中的 get 方法去掉 get 后首字母小写,与之类似,反序列化对应的是 set 方法。比如 getUser 序列化或 setUser 反序列化之后就是 user,所以一些不标准的命名方式会出现意料之外的问题,比如 getCtime。

序列化反序列化通用注解

@JsonProperty

序列化、反序列化时,修改属性的名称。可以作用于属性、getter/setter 方法上。同类型注解还有@JsonGetter@JsonSetter

jackson2 对 pojo 类型序列化的处理:(JsonProperty 作用于非常规定义属性上可能出现的问题) Jackson2 在初始化序列器时,对 pojo 类型对象会收集其属性信息,属性包括成员变量及方法,然后属性名称和处理过后的方法名称做为 key 保存到一个 LinkedHashMap 中。收集过程中会调用com.fasterxml.jackson.databind.util.BeanUtil 中的 legacyManglePropertyName 方法用来处理方法名称,它会将 getter/setter 方法前缀,即 get 或 set 去掉,并将其后面的连续大写字符转换成小写字符返回。例如: getNEWString 会转变成 newstring 返回。你的属性名称如果有这样的 “nSmallSellCount”,lombok 自动生成的 get 方法就会是这样的 “getNSmallSellCount”,处理过后就是这样的 “nsmallSellCount”,这与属性nSmallSellCount 并不冲突,可以同时存在于 HashMap 中。收集完属性信息后,下面的步骤中会删除掉非可见的属性,一般指的是私有成员变量,这时,名称为 “nSmallSellCount” 的成员变量属性会被删除掉,这样的序列化结果是不会有问题的,但,如果加了 @JsonProperty 注释,Jackson2 会认为这个属性是可见的,不必会删除,这时这两个表示同一个值得属性就会被一同序列化。

FastJson 使用注解 @JSONField 去修改序列化的属性名

@JsonIgnoreProperties

类级别注解,两个主要作用:

  1. 在序列化过程中标识忽略一个或多个属性;
  2. 反序列化过程中,表明忽略 json 中多余的属性,否则会报错。(ignoreUnknown=true,SpringBoot 对 ObjectMapper 进行了优化,可以不用配置)

    @JsonSerialize,@JsonDeserialize

    自定义序列化和反序列化规则,然后在字段上表明注解使用这个自定义规则。

    @JsonFormat

    序列化、反序列化时,格式化时间

    序列化注解

    @JsonIgnore

    作用于属性,序列化忽略某个属性

    @JsonInclude

    作用于属性,在序列化过程中,指定哪些字段参与序列化。

  3. JsonJsonInclude.Include.ALWAYS默认策略,任何情况下都序列化该字段

  4. JsonJsonInclude.Include.NON_NULL这个最常用,如果字段值为null,那么就不序列化这个字段了。
  5. JsonJsonInclude.Include.NON_EMPTY表明字段为空时,也不参与序列化。
  6. JsonJsonInclude.Include.NON_DEFAULT表明子段是默认值的话,就不参与序列化。

    JsonPropertyOrder

    作用于类上,指定序列化时字段的顺序。

    反序列化注解

    @JsonAlias

    为反序列化要接受的属性定义一个或多个替代名称,在客户端传参不统一的情况下很有用。
    可以与@JsonProperty一起使用