JSON数据编码全指南:从基础到实践
在数据交互的世界里,JSON(JavaScript Object Notation)以其轻量、易读、易解析的特性,成为前后端通信、API数据交换、配置文件存储等场景的“通用语言”,而“JSON数据编码”——即按照JSON规范将数据转换为字符串格式的过程,是开发者日常工作中几乎每天都会接触的操作,本文将从“什么是JSON编码”出发,详细讲解不同编程语言中的编码方法、常见问题及解决方案,帮你彻底JSON数据编码的核心技能。
先搞懂:什么是JSON数据编码?
JSON编码(也称为“序列化”或“序列化”)是指将编程语言原生数据类型(如Python的字典、Java的对象、JavaScript的对象/数组)转换为符合JSON规范的字符串的过程,JSON规范定义了数据交换的格式规则,包括数据类型(字符串、数字、布尔值、null、数组、对象)和语法(如双引号包裹键、冒号分隔键值对、逗号分隔元素等)。
举个例子,Python中的字典 {"name": "张三", "age": 30} 经过JSON编码后,会变成字符串 '{"name": "张三", "age": 30}',这个字符串可以直接通过网络传输、存储到文件或作为API响应体。
为什么需要JSON编码?
- 数据传输:网络通信中只能传输文本或二进制数据,JSON编码将复杂数据结构转换为文本字符串,便于HTTP/HTTPS等协议传输。
- 数据存储:将数据以JSON格式存储到文件或数据库中,方便后续读取和解析。
- 跨语言交互:JSON是语言无关的格式,不同编程语言通过JSON编码可以互相传递数据,无需关心底层实现差异。
核心原则:JSON编码必须遵守的规则
在动手编码前,必须明确JSON规范对数据格式的严格要求,否则可能导致解析失败或数据异常,核心规则包括:
数据类型支持
JSON原生支持以下6种数据类型:
- 字符串:必须用双引号()包裹,不能用单引号()。
"name",而非'name'或name。 - 数字:包括整数和浮点数,不支持八进制、十六进制(除非特殊场景),也不能有前导零(如
01)。30、14。 - 布尔值:只能是
true或false(全小写),而非True/False(Python)或TRUE/FALSE(其他语言)。 - null:表示空值,只能是
null(全小写),而非None(Python)或NULL(SQL)。 - 数组:使用方括号(
[])包裹,元素可以是上述任意类型,用逗号分隔。[1, "a", true]。 - 对象:使用花括号()包裹,键值对格式为
"key": value,键必须是字符串,值可以是任意类型,键值对用逗号分隔。{"key": "value"}。
语法细节
- 键必须用双引号,值如果是字符串也必须用双引号。
- 不能有尾随逗号(如数组最后一个元素后不能加,对象最后一个键值对后不能加)。
- 转义字符:支持常见的转义,如
\"(双引号)、\\(反斜杠)、\n(换行)、\t(制表符)等。
不同编程语言中的JSON编码实践
不同编程语言提供了内置库或第三方工具来实现JSON编码,下面通过主流语言示例,带你快速上手。
Python:使用json模块
Python标准库json提供了json.dumps()(dumps = dump string,将对象转为字符串)和json.dump()(将对象转为字符串并写入文件)方法。
基础编码示例
import json
# 原生数据类型(字典、列表、基本类型)
data = {
"name": "李四",
"age": 25,
"is_student": False,
"courses": ["数学", "英语"],
"address": None
}
# 使用json.dumps()编码为JSON字符串
json_str = json.dumps(data)
print(json_str)
# 输出:{"name": "李四", "age": 25, "is_student": false, "courses": ["数学", "英语"], "address": null}
格式化输出(美化JSON)
json.dumps()支持indent参数,用于缩进美化,方便调试:
pretty_json_str = json.dumps(data, indent=4, ensure_ascii=False)
print(pretty_json_str)
# 输出:
# {
# "name": "李四",
# "age": 25,
# "is_student": false,
# "courses": [
# "数学",
# "英语"
# ],
# "address": null
# }
ensure_ascii=False:确保非ASCII字符(如中文)不被转义为\u格式,直接显示原字符。
编码到文件
使用json.dump()直接将数据写入JSON文件:
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False)
# 生成data.json文件,内容为格式化后的JSON
JavaScript:使用JSON.stringify()
JavaScript原生提供JSON.stringify()方法,用于将JavaScript对象或值转换为JSON字符串。
基础编码示例
// JavaScript对象
const data = {
name: "王五",
age: 28,
isDeveloper: true,
skills: ["JavaScript", "Python"],
contact: null
};
// 使用JSON.stringify()编码
const jsonStr = JSON.stringify(data);
console.log(jsonStr);
// 输出:{"name":"王五","age":28,"isDeveloper":true,"skills":["JavaScript","Python"],"contact":null}
格式化输出(美化JSON)
JSON.stringify()支持replacer(替换函数)和space(缩进参数):
const prettyJsonStr = JSON.stringify(data, null, 2); // 2表示缩进2个空格
console.log(prettyJsonStr);
// 输出:
// {
// "name": "王五",
// "age": 28,
// "isDeveloper": true,
// "skills": [
// "JavaScript",
// "Python"
// ],
// "contact": null
// }
过滤属性(选择性编码)
通过replacer参数(函数或数组)控制哪些属性被编码:
// 只编码name和age
const filteredJsonStr = JSON.stringify(data, ["name", "age"]);
console.log(filteredJsonStr);
// 输出:{"name":"王五","age":28}
Java:使用Jackson或Gson库
Java没有内置的JSON编码支持,需借助第三方库,主流选择有Jackson(Spring Boot默认)、Gson(Google开发)。
使用Jackson(Maven依赖)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
编码示例
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonEncodeExample {
public static void main(String[] args) throws Exception {
// Java对象(POJO)
User user = new User("赵六", 30, true, new String[]{"Java", "C++"}, null);
// 创建ObjectMapper实例
ObjectMapper objectMapper = new ObjectMapper();
// 编码为JSON字符串
String jsonStr = objectMapper.writeValueAsString(user);
System.out.println(jsonStr);
// 输出:{"name":"赵六","age":30,"isStudent":true,"skills":["Java","C++"],"address":null}
// 格式化输出(美化)
String prettyJsonStr = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
System.out.println(prettyJsonStr);
// 输出:
// {
// "name" : "赵六",
// "age" : 30,
// "isStudent" : true,
// "skills" : [ "Java", "C++" ],
// "address" : null
// }
}
// 定义User类
static class User {
private String name;
private int age;
private boolean isStudent;
private String[] skills;
private String address;
// 构造方法、getter/setter省略(需无参构造方法)
}
}
使用Gson
import



还没有评论,来说两句吧...