CodeGym /课程 /JAVA 25 SELF /JSON 基础:结构、语法与优势

JSON 基础:结构、语法与优势

JAVA 25 SELF
第 46 级 , 课程 0
可用

1. 什么是 JSON(JavaScript Object Notation)?

JSON(读作“杰森”,不是按字母逐个拼读)是 JavaScript Object Notation 的缩写。尽管名字里包含“JavaScript”,JSON 是一种通用格式,几乎所有编程语言都支持,包括 Java。

JSON 由 Douglas Crockford 在 2000 年代初提出,作为在浏览器与服务器之间交换数据的简单方式。在此之前,主流是 XML——冗长且标签繁多。

JSON 更加紧凑、简单,也更易于“肉眼”阅读。它迅速成为客户端与服务器之间数据交换的事实标准,尤其是在 Web 与移动应用中。

为什么 JSON 成为标准?

  • 语法简单——手写、阅读都很容易。
  • 紧凑——没有多余的标签和“废话”。
  • 可读性强——即使非技术人士也能看懂。
  • 易于解析——大多数语言都有内置/第三方库。
  • 跨语言——Java、Python、Kotlin 等等——都支持 JSON。
  • REST API 的事实标准——绝大多数 API 返回 JSON。

与 XML 的比较

JSON XML
可读性 非常高 中等(标签很多)
体积 紧凑 更臃肿
解析 简单 更费力
可扩展性 支持嵌套 支持嵌套
严格性 不太严格 可定义 schema
流行度(2020+) 非常高 仍在使用,但更少

JSON 在几乎所有方面都占优。尽管如此,在需要复杂 schema、严格类型、基于 XSD 的校验、支持注释与属性的场景——例如在遗留系统与银行业软件中——XML 仍然有其用武之地。

在实践中,如果你不是在为银行或航天器编写软件——就用 JSON。

2. JSON 的基础语法

如果你用过 JavaScript 的object或其他语言的字典,语法会觉得很熟悉。在 Java 中没有直接的“字典”,其角色由 java.util 中的集合承担,首选 Map<K, V>(通常是 HashMap<K, V>)。

基本元素

  • object——由若干“key: value”对组成,用 { } 包裹。
  • array——有序的value列表,用 [ ] 包裹。

object示例:

{
  "name": "Alice",
  "age": 25
}

array示例:

[1, 2, 3, 4, 5]

包含array的object示例:

{
  "students": [
    "Ivan",
    "Maria",
    "John"
  ]
}

允许的value类型

JSON 只支持以下数据类型:

类型 示例 说明
字符串
"hello"
始终使用双引号
数字
123, 3.14, -7
整数与小数
布尔
true, false
布尔value
null
null
空,表示没有value
object
{ ... }
若干“key: value”对的集合
array
[ ... ]
value的列表

注意:object中的key必须是使用双引号的字符串,例如 "name"。不允许使用单引号。

有效 JSON 示例

{
  "id": 1,
  "name": "Bob",
  "active": true,
  "scores": [10, 20, 30],
  "profile": {
    "email": "bob@example.com",
    "phone": null
  }
}

无效的 JSON 示例(错误)

{
  name: 'Bob', // 错误:key和value必须使用双引号!
  age: 25,
}

3. 数据结构:object与array的嵌套

JSON 支持深度嵌套:object中可以有object、object中可以有array、array中可以有object,等等,就像套娃。

复杂 JSON 文档示例

{
  "university": "Java University",
  "students": [
    {
      "name": "Ivan",
      "age": 20,
      "courses": ["Math", "Java", "English"]
    },
    {
      "name": "Maria",
      "age": 19,
      "courses": ["Biology", "Java", "Art"]
    }
  ],
  "active": true
}

在根object中有一个字符串字段 "university",一个布尔字段 "active",以及一个array "students",其中存放学生object。

可视化示意(方框图)

{
  "key": value,
  "array": [
    { "key": value },
    { "key": value }
  ],
  "object": {
    "key": value
  }
}

4. JSON 的优势

为什么 JSON 如此流行?

  1. 对人和机器都易读——结构一目了然。
  2. 紧凑——冗余符号最少。
  3. 易于解析——读写库非常多。
  4. REST API 与移动应用的事实标准——无处不在。
  5. 灵活——既能表示简单列表,也能表示树形结构。
  6. 配置、设置、数据存储——常用于各类配置。
  7. 语言全面支持——Java、Python、Go、Rust 等。

5. 实践:解析 JSON 文件示例

示例 1:用户列表

[
  {
    "id": 1,
    "name": "Alice"
  },
  {
    "id": 2,
    "name": "Bob"
  }
]

这是一个array,其中每个元素都是一个用户object。

示例 2:应用配置

{
  "debug": true,
  "maxConnections": 100,
  "database": {
    "host": "localhost",
    "port": 5432,
    "user": "admin",
    "password": "password"
  }
}

该object包含一个嵌套object "database"。这与真实的应用配置非常相似。

示例 3:JSON 中的错误

{
  "name": "Alice",
  "age": 25,
} // 错误:闭合括号前多了一个逗号!

请记住:在 JSON 中,最后一个元素后不能加逗号。

示例 4:未加引号的key

{ name: "Alice", age: 25 } // 错误:key必须使用双引号!

6. 实用细节

表格:JSON 中哪些可以,哪些不可以

可以 不可以
"key": "value"
'key': 'value'
"key": 123
"key": 0123
"key": null
"key": undefined
"key": true
"key": True
"key": [1, 2, 3]
"key": [1, 2, 3,]

JSON 与 Java object的简要对照

Java JSON
int, double, boolean
数字,true/false
String
"字符串"
List<T>, array [value1, value2, ...]
Map<String, Object>
{ "key": value, ... }
null
null
带字段的类 { "字段": value, ... }

示例:Java 类及其 JSON 表示

public class Student {
    public String name;
    public int age;
}
{
  "name": "Alice",
  "age": 20
}

7. 使用 JSON 常见错误

错误 1:用单引号代替双引号。JSON 只接受用于key和字符串的双引号。

{ 'name': 'Alice' } // 错误!

错误 2:多余的逗号。不允许在最后一个元素后添加逗号。

{ "name": "Alice", } // 错误!

错误 3:key未加引号。key必须始终用双引号括起来。

{ name: "Alice" } // 错误!

错误 4:带前导零的数字。这类数字是无效的。

{ "age": 025 } // 错误!

错误 5:使用 undefinedJSON 中没有 undefined,请使用 null

{ "value": undefined } // 错误!

错误 6:True/False 首字母大写。JSON 只有小写的 truefalse

{ "active": True } // 错误!
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION