JSON

JSON

JSON基本概念

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于 JavaScript 的一个子集,但 JSON 是独立于语言的,许多编程语言都支持 JSON。

JSON基本结构

  • JSON 数据由键值对组成,键和值之间用冒号 : 分隔,键值对之间用逗号 , 分隔。JSON 数据有两种基本结构:
    • 对象(Object):用花括号 {} 表示,包含一组无序的键值对。
    • 数组(Array):用方括号 [] 表示,包含一组有序的值。

JSON的数据类型

  • 字符串(String):用双引号 "" 括起来的文本。
  • 数字(Number):整数或浮点数。
  • 布尔值(Boolean)truefalse
  • 数组(Array):有序的值列表。
  • 对象(Object):无序的键值对集合。
  • null:表示空值。

JSON示例

{
  "name": "John Doe",
  "age": 30,
  "isStudent": false,
  "address": {
    "street": "123 Main St",
    "city": "Anytown",
    "state": "CA",
    "postalCode": "12345"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "office",
      "number": "646 555-4567"
    }
  ],
  "children": [],
  "spouse": null
}

JSON解析

JavaScript中使用JSON

JavaScript中解析

  • 在 JavaScript 中,可以使用 JSON.parse() 方法将 JSON 字符串解析为 JavaScript 对象。

  • const jsonString = '{"name": "John Doe", "age": 30}';
    const obj = JSON.parse(jsonString);
    console.log(obj.name); // 输出: John Doe
    

JavaScript生成JSON

  • 在 JavaScript 中,可以使用 JSON.stringify() 方法将 JavaScript 对象转换为 JSON 字符串

  • const obj = { name: "John Doe", age: 30 };
    const jsonString = JSON.stringify(obj);
    console.log(jsonString); // 输出: {"name":"John Doe","age":30}
    

JAVA中使用JSON

Java解析JSON

使用 Jackson 生成和解析 JSON

  1. 使用 Maven,可以在 pom.xml 中添加 Jackson 依赖:

    • <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.15.0</version>
      </dependency>
      
  2. 生成 JSON

    • import com.fasterxml.jackson.databind.ObjectMapper;
      
      public class JacksonExample {
          public static void main(String[] args) throws Exception {
              // 创建一个 Java 对象
              Person person = new Person("John Doe", 30);
      
              // 创建 ObjectMapper 对象
              ObjectMapper mapper = new ObjectMapper();
      
              // 将 Java 对象转换为 JSON 字符串
              String jsonString = mapper.writeValueAsString(person);
              System.out.println("生成的 JSON: " + jsonString);
          }
      }
      
      class Person {
          private String name;
          private int age;
      
          // 构造方法、getter 和 setter
          public Person(String name, int age) {
              this.name = name;
              this.age = age;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      }
      //生成的 JSON: {"name":"John Doe","age":30}
      
  3. 解析JSON

    • 将 JSON 字符串转换为 Java 对象

    • import com.fasterxml.jackson.databind.ObjectMapper;
      
      public class JacksonExample {
          public static void main(String[] args) throws Exception {
              // JSON 字符串
              String jsonString = "{\"name\":\"John Doe\",\"age\":30}";
      
              // 创建 ObjectMapper 对象
              ObjectMapper mapper = new ObjectMapper();
      
              // 将 JSON 字符串转换为 Java 对象
              Person person = mapper.readValue(jsonString, Person.class);
              System.out.println("解析的 Java 对象: " + person.getName() + ", " + person.getAge());
          }
      }
      

Jackson 的要求

  • Jackson 默认通过 getter 方法字段 来获取对象的属性值并生成 JSON。
    • 类中的字段需要是 非私有publicprotected 或默认包访问权限),或者提供对应的 getter 方法
    • getter 方法的命名需要符合 Java Bean 规范(例如,字段 name 的 getter 方法为 getName())。
    • 如果字段是 private 且没有 getter 方法,Jackson 无法访问该字段,生成 JSON 时会忽略该字段。
    • 可以通过 @JsonProperty 注解显式指定字段名。
  • Jackson 默认通过 setter 方法字段 来设置对象的属性值。
    • 类中的字段需要是 非私有,或者提供对应的 setter 方法
    • setter 方法的命名需要符合 Java Bean 规范(例如,字段 name 的 setter 方法为 setName(String name))。
    • 如果字段是 private 且没有 setter 方法,Jackson 无法设置该字段,解析 JSON 时会忽略该字段。
    • 可以通过 @JsonProperty 注解显式指定字段名。

使用Gson 生成和解析 JSON

  1. 添加依赖

    • pom.xml 中添加 Gson 依赖:

    • <dependency>
          <groupId>com.google.code.gson</groupId>
          <artifactId>gson</artifactId>
          <version>2.10.1</version>
      </dependency>
      
  2. 生成JSON

    • import com.google.gson.Gson;
      
      public class GsonExample {
          public static void main(String[] args) {
              // 创建一个 Java 对象
              Person person = new Person("John Doe", 30);
      
              // 创建 Gson 对象
              Gson gson = new Gson();
      
              // 将 Java 对象转换为 JSON 字符串
              String jsonString = gson.toJson(person);
              System.out.println("生成的 JSON: " + jsonString);
          }
      }
      
  3. 解析JSON

    • import com.google.gson.Gson;
      
      public class GsonExample {
          public static void main(String[] args) {
              // JSON 字符串
              String jsonString = "{\"name\":\"John Doe\",\"age\":30}";
      
              // 创建 Gson 对象
              Gson gson = new Gson();
      
              // 将 JSON 字符串转换为 Java 对象
              Person person = gson.fromJson(jsonString, Person.class);
              System.out.println("解析的 Java 对象: " + person.getName() + ", " + person.getAge());
          }
      }
      

Gson 的要求

  • Gson 默认通过 字段 来获取对象的属性值并生成 JSON。
    • 类中的字段需要是 非私有publicprotected 或默认包访问权限),或者提供对应的 getter 方法
    • 如果字段是 private,Gson 仍然可以通过反射访问字段值。
  • Gson 默认通过 字段 来设置对象的属性值。
    • 类中的字段需要是 非私有,或者提供对应的 setter 方法
    • 如果字段是 private,Gson 仍然可以通过反射设置字段值。

JSON消息规范

{
    "code":"101,102,...."
    "message":"业务状态码的描述信息"
    "data":{
    /*
    	返回的相关数据信息
    */
	}
}

Json忽略字段方法

  • 使用 @JsonIgnore 注解

    • @JsonIgnore 是 Jackson 提供的一个注解,用于标记某个字段在序列化和反序列化时被忽略。

    • import com.fasterxml.jackson.annotation.JsonIgnore;
      
      public class User {
      
          private Long id;
      
          private String username;
      
          @JsonIgnore // 忽略该字段
          private String password;
      
          // Getter和Setter方法
      }
      
  • 使用 @JsonIgnoreProperties 注解

    • @JsonIgnoreProperties 是 Jackson 提供的另一个注解,可以用于类级别,指定需要忽略的字段

    • import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
      
      @JsonIgnoreProperties({"password"}) // 忽略password字段
      public class User {
      
          private Long id;
      
          private String username;
      
          private String password;
      
          // Getter和Setter方法
      }
      
  • 使用 transient 关键字

    • transient 是 Java 的关键字,用于标记字段不被序列化。Jackson 也会忽略 transient 字段。
  • 使用 @JsonProperty 注解控制字段的可见性

    • @JsonProperty 注解可以设置字段的访问权限。通过设置 access = JsonProperty.Access.WRITE_ONLY,可以让字段只在反序列化时使用,而在序列化时忽略。

    • import com.fasterxml.jackson.annotation.JsonProperty;
      
      public class User {
      
          private Long id;
      
          private String username;
      
          @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) // 只在反序列化时使用
          private String password;
      
          // Getter和Setter方法
      }
      
  • 使用 @JsonInclude 注解忽略空值

    • 如果希望在序列化时忽略值为 null 的字段,可以使用 @JsonInclude 注解。

    • import com.fasterxml.jackson.annotation.JsonInclude;
      
      @JsonInclude(JsonInclude.Include.NON_NULL) // 忽略值为null的字段
      public class User {
      
          private Long id;
      
          private String username;
      
          private String password;
      
          // Getter和Setter方法
      }
      
posted @ 2025-03-18 14:50  QAQ001  阅读(44)  评论(0)    收藏  举报