什么是 JSON?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于 JavaScript 的对象字面量语法,但独立于编程语言,易于人阅读和编写,同时也易于机器解析和生成。

JSON 已成为 Web 开发中最常用的数据交换格式,广泛用于 API 响应、配置文件、数据存储等场景。

JSON 数据类型

字符串 (String)
"Hello World"
双引号包裹的文本
数字 (Number)
42, 3.14, -100
整数或浮点数
布尔值 (Boolean)
true, false
真或假
空值 (Null)
null
表示空或不存在的值
对象 (Object)
{"name": "张三"}
键值对集合,用 {} 包裹
数组 (Array)
[1, 2, 3]
有序值列表,用 [] 包裹

JSON 格式化示例

压缩 JSON

{"name":"张三","age":25,"skills":["JavaScript","Python"],"address":{"city":"北京","zip":"100000"}}

格式化 JSON

{
  "name": "张三",
  "age": 25,
  "skills": [
    "JavaScript",
    "Python"
  ],
  "address": {
    "city": "北京",
    "zip": "100000"
  }
}

编程语言中解析 JSON

JavaScript

// 解析 JSON 字符串
const jsonStr = '{"name": "张三", "age": 25}';
const obj = JSON.parse(jsonStr);
console.log(obj.name); // "张三"

// 对象转 JSON 字符串
const data = { name: "李四", age: 30 };
const str = JSON.stringify(data);
console.log(str); // '{"name":"李四","age":30}'

// 格式化输出(带缩进)
const pretty = JSON.stringify(data, null, 2);
console.log(pretty);

// 解析时处理错误
try {
  const result = JSON.parse('invalid json');
} catch (e) {
  console.error('JSON 解析失败:', e.message);
}

Python

import json

# 解析 JSON 字符串
json_str = '{"name": "张三", "age": 25}'
data = json.loads(json_str)
print(data['name'])  # "张三"

# 对象转 JSON 字符串
person = {"name": "李四", "age": 30}
json_str = json.dumps(person)
print(json_str)  # '{"name": "\u674e\u56db", "age": 30}'

# 格式化输出(带缩进)
pretty = json.dumps(person, indent=2, ensure_ascii=False)
print(pretty)

# 从文件读取 JSON
with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

# 写入 JSON 到文件
with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, indent=2, ensure_ascii=False)

Java

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

// 使用 Gson 库
Gson gson = new Gson();

// 解析 JSON 字符串
String jsonStr = "{\"name\": \"张三\", \"age\": 25}";
Person person = gson.fromJson(jsonStr, Person.class);

// 对象转 JSON 字符串
Person p = new Person("李四", 30);
String json = gson.toJson(p);

// 格式化输出
Gson prettyGson = new GsonBuilder().setPrettyPrinting().create();
String pretty = prettyGson.toJson(p);

// 使用 Jackson 库
import com.fasterxml.jackson.databind.ObjectMapper;
ObjectMapper mapper = new ObjectMapper();
MyClass obj = mapper.readValue(jsonStr, MyClass.class);
String json = mapper.writeValueAsString(obj);
String pretty = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);

PHP

// 解析 JSON 字符串
$jsonStr = '{"name": "张三", "age": 25}';
$data = json_decode($jsonStr, true);  // true 返回数组
echo $data['name'];  // "张三"

// 对象方式访问
$obj = json_decode($jsonStr);
echo $obj->name;  // "张三"

// 数组转 JSON 字符串
$person = ['name' => '李四', 'age' => 30];
$json = json_encode($person, JSON_UNESCAPED_UNICODE);
echo $json;  // '{"name":"李四","age":30}'

// 格式化输出
$pretty = json_encode($person, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $pretty;

// 错误处理
$data = json_decode('invalid json');
if (json_last_error() !== JSON_ERROR_NONE) {
    echo 'JSON 解析失败: ' . json_last_error_msg();
}

Go

import "encoding/json"

// 定义结构体
type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

// 解析 JSON 字符串
jsonStr := `{"name": "张三", "age": 25}`
var person Person
err := json.Unmarshal([]byte(jsonStr), &person)
if err != nil {
    panic(err)
}
fmt.Println(person.Name) // "张三"

// 对象转 JSON 字符串
p := Person{Name: "李四", Age: 30}
jsonData, _ := json.Marshal(p)
fmt.Println(string(jsonData))

// 格式化输出
prettyJSON, _ := json.MarshalIndent(p, "", "  ")
fmt.Println(string(prettyJSON))

// 解析到 map
var data map[string]interface{}
json.Unmarshal([]byte(jsonStr), &data)

C#

using System.Text.Json;

// 解析 JSON 字符串
string jsonStr = @"{""name"": ""张三"", ""age"": 25}";
var person = JsonSerializer.Deserialize<Person>(jsonStr);
Console.WriteLine(person.Name); // "张三"

// 对象转 JSON 字符串
var p = new Person { Name = "李四", Age = 30 };
string json = JsonSerializer.Serialize(p);

// 格式化输出
var options = new JsonSerializerOptions { WriteIndented = true };
string pretty = JsonSerializer.Serialize(p, options);
Console.WriteLine(pretty);

// 使用 JsonNode 动态解析
using System.Text.Json.Nodes;
JsonNode node = JsonNode.Parse(jsonStr);
Console.WriteLine(node["name"]);

// 使用 JObject (Newtonsoft.Json)
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
var obj = JObject.Parse(jsonStr);
Console.WriteLine(obj["name"]);
string pretty = JsonConvert.SerializeObject(p, Formatting.Indented);

Ruby

require 'json'

# 解析 JSON 字符串
json_str = '{"name": "张三", "age": 25}'
data = JSON.parse(json_str)
puts data['name']  # "张三"

# 对象转 JSON 字符串
person = { name: '李四', age: 30 }
json = person.to_json
puts json  # '{"name":"李四","age":30}'

# 格式化输出
pretty = JSON.pretty_generate(person)
puts pretty

# 从文件读取
data = JSON.parse(File.read('data.json'))

# 写入文件
File.write('output.json', JSON.pretty_generate(data))

Shell / 命令行

# 使用 jq 工具格式化 JSON
echo '{"name":"张三","age":25}' | jq .

# 提取字段
echo '{"name":"张三","age":25}' | jq '.name'
# 输出: "张三"

# 压缩 JSON
echo '{"name": "张三", "age": 25}' | jq -c .

# 使用 Python
echo '{"name":"张三"}' | python3 -m json.tool

# 验证 JSON
echo '{"name":"张三"}' | jq . > /dev/null && echo "Valid" || echo "Invalid"

JSON 常见应用场景

🌐 API 响应

RESTful API 最常用的响应格式,前后端数据交互标准

⚙️ 配置文件

package.json、tsconfig.json 等项目配置文件

💾 数据存储

NoSQL 数据库(如 MongoDB)使用 JSON 格式存储

📱 移动应用

移动端与服务器的数据通信格式

🔗 微服务通信

服务间消息传递和数据交换

📊 数据分析

数据导出、日志记录、数据交换

JSON 语法规则

键必须用双引号包裹,不能用单引号
字符串必须用双引号包裹
数字不需要引号
键值对之间用冒号分隔
多个键值对用逗号分隔
最后一个元素后不能有逗号
不支持注释
不支持 undefined、函数、Date 等类型

常见问题

Q: JSON 和 JavaScript 对象有什么区别?

A: JSON 是数据格式,键必须用双引号;JavaScript 对象是编程语言特性,键可以不用引号或用单引号。JSON 不支持函数、undefined、注释等 JavaScript 特有内容。

Q: 为什么 JSON.parse 会报错?

A: 常见原因:1) JSON 格式不正确(缺少引号、多余逗号等);2) 包含单引号而非双引号;3) 包含注释;4) 包含 undefined 或函数等不支持的类型;5) 末尾有多余字符。

Q: JSON 和 XML 如何选择?

A: JSON 更轻量、解析更快、与 JavaScript 天然兼容,适合 Web API;XML 支持注释、命名空间、属性等复杂特性,适合需要严格验证的场景。现代 Web 开发首选 JSON。

Q: 如何处理 JSON 中的特殊字符?

A: JSON 使用反斜杠转义特殊字符:\" 表示双引号,\\ 表示反斜杠,\n 表示换行,\t 表示制表符,\uXXXX 表示 Unicode 字符。大多数 JSON 库会自动处理转义。