JSON学习笔记

JSON学习笔记

Jackson篇


  1. Jackson是目前使用非常广泛的JSON生成和解析工具。

  2. Jackson由3个模块组成:

    • Jaskson-core:核心包,包括JSON解析器生成器
    • Jackson-annotations:注解包,提供处理数据的注解
    • Jackson-databind:数据绑定包,将数据与Java对象绑定
      【注】Jackson-databind依赖于core、annotations包,一般引入databind包即可。
  3. ObjectMapper是Jackson的核心类,用来完成JSON的读写操作。

    • writeValueAsString(): 将Java对象 –> JSON字符串
    • readValue(): 将JSON字符串 –> Java对象
  4. 如果是Spring Boot项目,ObjectMapper已经存在于Spring容器中,可以通过`@Autowired注入ObjectMapper对象。

  5. Java对象的成员变量的名称和值都会成为JSON中的属性名属性值

    • (强烈推荐!)可以通过将`@JsonProperty注解在Java对象的成员变量上修改转换JSON后的属性名称,如图1所示。
      '图1'

    • 如果不需要将Java对象的某个成员变量转换为JSON,则可以在成员变量上加上`@JsonIgnore注解,如图2所示。

      或者使用`@JsonIgnoreProperties注解,将其注解在Java类上,最终实现效果相同,如图3所示。

    • 如果在Java对象中使用private成员变量,并用Getter/Setter方法操作成员变量,则JSON将Getter方法确定JSON属性名,如图4所示。

      • 既然Jackson会根据Getter方法确定JSON属性名,那么用来JSON属性名称的`@JsonProperty注解同样可以标注在Getter方法上
  6. Jackson按照以下顺序确定JSON属性名:

    • public的成员变量
    • public的Getter方法(在成员变量设置为private的情况下)
    • 所有作用域的Setter方法
  7. 强烈推荐】只根据成员变量确定JSON属性名,并忽略掉所有的Getter / Setter方法的自动检测,方法如下:修改ObjectMapper对象的属性,如图所示

    objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
    objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
    • 如果是Spring Boot项目,则可以在application.properties配置文件中添加如下配置:
      spring.jackson.visibility.all = none
      spring,jackson.visibility.field = any
      如图6所示。
  8. 自定义JSON对象:

    • 使用ObjectMapper对象的**createObjectNode()**方法,创建一个新的对象。
    • 使用ObjectNode对象的**put() / putArray()**方法添加数据。
    • 在JSON中添加数组时,实际上是往ArrayNode对象中添加数组内容,并保存到JSON对象中。
    • 具体使用情况如图7所示
  9. 解析JSON对象(Java对象中缺失对应的属性)

    • 类级别忽略未知JSON属性:
      使用`**@JsonIgnoreProperties(ignoreUnknown = true)**注解声明在类上

      @JsonIgnoreProperties(ignoreUnknown = true)
      public class User {
          // ...
      }
          
    • 全局忽略未知JSON属性:
      配置ObjectMapper对象的属性,代码如下:

      // 配置忽略未知属性
      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
         
  10. 解析JSON对象(不完整的JSON对象)

  • 直接使用**readValue()**方法读取JSON对象。

Fastjson篇


  1. Fastjson是Alibaba开发的用于实现JSON对象与Java对象之间相互转换的包。

  2. Fastjson包中有3个类:

    • JSON
    • JSONArray:继承自JSON,实现了List接口,代表JSON对象数组,其存储这一个个的JSON对象。
    • JSONObject:继承自JSON,实现了Map接口,代表着JSON对象,所有数据都是以“键:值”的方式出现。
  3. 常用方法:

    • **parseObject()**:将JSON字符串 –> JSONObject
    • **toJSONString()**:将JSONObject / JSONArray –> JSON字符串
    • parseArray(): 将JSON字符串数组 –> JSONArray

参考文章:使用Jackson生成和解析JSONJackson忽略未知的JSON属性JSON格式及FastJson使用详解


  目录