Skip to content

JSON

JSON(JavaScript Object Notation)即JavaScript对象表示法,是一种轻量级的数据交换格式。JSON由Douglas Crockford在2001年开始推广使用,在2005 - 2006年正式成为主流的数据格式,当时雅虎和谷歌开始广泛使用JSON格式。

基本概念

  • 定义:它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

  • 本质:JSON本质上是一个字符串,是JS对象的字符串表示法,用于表示JS对象的信息。例如,var obj = {a: 'Hello', b: 'World'}; 这是一个JS对象,而 var json = '{"a": "Hello", "b": "World"}'; 则是对应的JSON字符串。

  • 轻量级:数据格式简洁,占用存储空间小,在网络传输中能有效减少数据传输量,提升传输效率。
  • 可读性好:层次结构清晰,易于人类阅读和编写。
  • 语言独立性:虽然源自JavaScript,但已发展为独立于编程语言的数据格式,几乎所有主流编程语言都支持JSON,解析器和相关库丰富,便于不同系统和语言间的数据交换。
  • 易于解析生成:计算机可快速解析和生成JSON数据,无需复杂处理。
  • Web开发:常用于服务器和Web应用之间传输数据。例如用户在网页上操作,应用将用户输入以JSON格式发送到服务器,服务器处理后再以JSON格式返回响应,实现客户端和服务器间无缝数据交换,打造交互式Web体验。
  • 配置文件:在应用或IT系统内用于存储和管理配置设置,以JSON格式编写配置文件,方便读取和修改。
  • API编程:在API接口中作为数据传输格式,不同系统通过API交互时,以JSON格式传递数据,方便快捷。
  • 数据存储:一些数据库(如MongoDB等NoSQL文档数据库 )以JSON格式存储数据,便于数据的存储和查询,且在数据交换时无需额外处理。
  • 可读性:JSON语法简易,XML采用规范标签形式,两者可读性难分高下,但JSON在数据交换场景中,因字符使用少,相对更易阅读。
  • 可扩展性:XML天生扩展性好,JSON同样具备扩展性,且在JavaScript环境中,存储JavaScript复合对象方面有优势。
  • 数据表示:两者都用结构化方法标记数据,但JSON格式更简洁,占用带宽少。例如表示中国部分省市数据,JSON的层次结构更清晰,占用空间更小。

语法规则

  • 构造字符:包括六个构造字符:[]{}:, 。在这些构造字符前后允许存在无意义的空白符(如空格、水平标签、换行、回程等)。

  • 值的类型

JSON主要有以下6种值类型:

对象(Object):由花括号 {} 包围,是一组无序的“键值对”集合,键必须是字符串,值可以是字符串、数字、布尔值、数组、对象或 null。不同键值对之间用逗号 , 分隔。

示例
{
  "person": {
    "name": "Alice",
    "age": 30,
    "isStudent": false,
    "hobbies": ["reading", "swimming"],
    "address": {
      "street": "123 Main St",
      "city": "Anytown"
    },
    "phone": null
  }
}

数组(Array):由方括号 [] 包围,是一个有序的值集合,数组中的值可以是任意JSON支持的类型,包括对象、数组、字符串、数字、布尔值或 null,不同值之间用逗号 , 分隔。

示例
1
2
3
4
5
{
  "fruits": ["apple", "banana", "cherry"],
  "numbers": [1, 2, 3, 4.5, -6],
  "mixed": [true, false, null, {"key": "value"}, ["nested", "array"]]
}

字符串(String):由双引号 "" 包围的任意数量Unicode字符的集合,可使用反斜线 \ 进行转义。

示例
1
2
3
4
{
  "message": "Hello, world!",
  "description": "This is a \"quoted\" string with a \nnewline and a \t tab."
}

数字(Number):不区分整型和浮点型,采用IEEE - 754双精度浮点格式表示,不能使用八进制和十六进制表示,但可以使用 eE 表示10的指数。

示例
1
2
3
4
5
{
  "count": 10,
  "price": 9.99,
  "scientificNotation": 1.23E+4
}

布尔值(Boolean):只有两个值,即 true(真)和 false(假),表示逻辑判断的结果。

示例
1
2
3
4
{
  "isLoggedIn": true,
  "hasError": false
}

空值(Null):用 null 表示,用于表示某个值不存在或尚未赋值。

示例
1
2
3
4
{
  "result": null,
  "missingValue": null
}

与JS对象的关系及转换

  • 关系:JSON是JS对象的字符串表示形式。

  • 转换方法

    • JSON字符串转JS对象:使用 JSON.parse() 方法,例如:
    var obj = JSON.parse('{"a": "Hello", "b": "World"}');
    
    • JS对象转JSON字符串:使用 JSON.stringify() 方法,例如:
    var json = JSON.stringify({a: 'Hello', b: 'World'});
    

JSON的使用方法

  1. JSON对象的创建

    可以使用JavaScript的对象字面量语法来创建JSON对象

    示例
    1
    2
    3
    4
    5
    var person = {
      "name": "John",
      "age": 30,
      "city": "New York"
    };
    
  2. JSON字符串的解析

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

    示例
    var jsonStr = '{"name":"John","age":30,"city":"New York"}';
    var person = JSON.parse(jsonStr);
    
  3. JavaScript对象的序列化

    可以使用JSON.stringify()方法将JavaScript对象序列化为JSON字符串

    示例
    var person = { "name": "John", "age": 30, "city": "New York" };
    var jsonStr = JSON.stringify(person);
    

在Spring Boot中使用JSON可以通过Jackson库来实现。首先需要在pom.xml文件中添加Jackson依赖:

示例
1
2
3
4
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

然后在Controller中使用@ResponseBody注解将返回值转换为JSON格式:

示例
@RestController
public class MyController {
    @GetMapping("/myEndpoint")
    public MyObject getMyObject() {
        MyObject myObject = new MyObject();
        // set properties of myObject
        return myObject;
    }
}

class MyObject {
    private String name;
    private int age;
    // getters and setters
}

这样,当访问/myEndpoint时,返回的MyObject对象会被自动转换为JSON格式。

Jackson库是一个用于Java语言的JSON处理库,它提供了一系列的API来解析、生成和操作JSON数据。下面是一个简单的使用示例:

  1. 导入Jackson库的依赖:

    示例
    1
    2
    3
    4
    5
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.12.3</version>
    </dependency>
    
  2. 创建一个Java对象,并将其转换为JSON字符串:

    示例
    public class Person {
        private String name;
        private int age;
    
        // getters and setters
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    ObjectMapper objectMapper = new ObjectMapper();
    Person person = new Person();
    person.setName("John");
    person.setAge(30);
    String json = objectMapper.writeValueAsString(person);
    System.out.println(json); // {"name":"John","age":30}
    
  3. 将JSON字符串转换为Java对象:

    示例
    1
    2
    3
    String json = "{\"name\":\"John\",\"age\":30}";
    Person person = objectMapper.readValue(json, Person.class);
    System.out.println(person); // Person{name='John', age=30}
    

除了上述示例中的基本用法外,Jackson库还提供了许多高级功能,例如处理日期、枚举、多态等。具体使用方法可以参考官方文档。