JSON字符串怎么做?从基础到实践的完整指南
在数据交互领域,JSON(JavaScript Object Notation)以其轻量级、易读、易解析的特性,成为前后端通信、API数据交换、配置文件存储等场景的主流格式,而“JSON字符串”作为JSON数据在文本形式下的载体,是开发者必须的核心概念,本文将从JSON字符串的定义出发,详细拆解其创建、转换、验证及常见问题处理,助你从零开始JSON字符串的实操方法。
先搞懂:什么是JSON字符串?
JSON字符串本质上是一个符合JSON格式规范的文本字符串,它用字符串的形式表示JSON对象或数组,便于在网络传输、文件存储等场景中传递结构化数据。
'{"name":"张三","age":25,"isStudent":false,"courses":["数学","英语"]}'
这段文本就是一个JSON字符串——它被单引号(或双引号)包裹,内容严格遵循JSON格式:键必须用双引号包围,值可以是字符串、数字、布尔值、数组、null,或嵌套的JSON对象。
JSON字符串的“黄金格式规则”
要正确创建JSON字符串,必须遵守以下核心规范,否则会导致解析失败:
键名必须用双引号
键名(对象的属性名)必须用双引号包裹,不能用单引号或无引号。
✅ 正确:"name":"李四"
❌ 错误:'name':'李四' 或 name:李四
值的类型限制
JSON支持的值类型包括:
- 字符串:双引号包裹,如
"北京" - 数字:整数或浮点数,如
18、14(不支持科学计数法如1e3) - 布尔值:
true或false(全小写,非True/False) - null:表示空值,
null(全小写,非NULL) - 数组:用方括号
[]包裹,元素间用逗号分隔,如[1,2,3] - 对象:用花括号包裹,如
{"key":"value"}
逗号和转义字符
- 对象或数组中,最后一个元素后不能有逗号(否则部分解析器会报错)。
✅ 正确:{"a":1,"b":2}
❌ 错误:{"a":1,"b":2,} - 字符串中的特殊字符需转义:双引号需写成
\",反斜杠\需写成\\,换行符需写成\n等。
JSON字符串的“诞生记”:从数据到字符串的转换
在开发中,我们常需要将编程语言原生数据类型(如Python的字典、JavaScript的对象)转换为JSON字符串,这个过程称为“序列化”;反之,将JSON字符串解析为原生数据类型,称为“反序列化”,以下以常见语言为例,说明如何创建JSON字符串。
JavaScript:JSON.stringify()
JavaScript中,使用JSON.stringify()方法可将对象、数组等转换为JSON字符串。
// 1. 基础对象转换
const user = {
name: "王五",
age: 30,
hobbies: ["阅读", "游泳"],
address: {
city: "上海",
district: "浦东新区"
}
};
const jsonString = JSON.stringify(user);
console.log(jsonString);
// 输出:{"name":"王五","age":30,"hobbies":["阅读","游泳"],"address":{"city":"上海","district":"浦东新区"}}
// 2. 格式化输出(美化JSON)
const prettyJsonString = JSON.stringify(user, null, 2); // 2为缩进空格数
console.log(prettyJsonString);
/* 输出:
{
"name": "王五",
"age": 30,
"hobbies": [
"阅读",
"游泳"
],
"address": {
"city": "上海",
"district": "浦东新区"
}
}
*/
// 3. 处理特殊值(undefined、函数会被忽略)
const obj = {
name: "赵六",
age: undefined,
sayHi: function() { console.log("Hi"); }
};
console.log(JSON.stringify(obj)); // 输出:{"name":"赵六"}
Python:json.dumps()
Python中,通过json模块的dumps()(dump string)方法可将字典、列表等转换为JSON字符串。
import json
# 1. 基础字典转换
user = {
"name": "钱七",
"age": 28,
"isMarried": False,
"scores": [85, 90, 78]
}
json_string = json.dumps(user)
print(json_string)
# 输出:{"name": "钱七", "age": 28, "isMarried": false, "scores": [85, 90, 78]}
# 2. 处理中文(默认ASCII编码,需ensure_ascii=False)
user_with_chinese = {"name": "中文测试", "city": "北京"}
json_string_chinese = json.dumps(user_with_chinese, ensure_ascii=False, indent=2)
print(json_string_chinese)
/* 输出:
{
"name": "中文测试",
"city": "北京"
}
*/
# 3. 格式化输出(indent参数控制缩进)
pretty_json = json.dumps(user, indent=4, ensure_ascii=False)
print(pretty_json)
Java:Jackson/Gson库
Java中没有内置的JSON支持,需借助第三方库(如Jackson、Gson),以Gson为例:
import com.google.gson.Gson;
public class JsonStringExample {
public static void main(String[] args) {
// 1. 定义Java对象
User user = new User("孙八", 25, true, new String[]{"Java", "Python"});
// 2. 使用Gson转换为JSON字符串
Gson gson = new Gson();
String jsonString = gson.toJson(user);
System.out.println(jsonString);
// 输出:{"name":"孙八","age":25,"isStudent":true,"courses":["Java","Python"]}
}
}
// 定义User类
class User {
private String name;
private int age;
private boolean isStudent;
private String[] courses;
public User(String name, int age, boolean isStudent, String[] courses) {
this.name = name;
this.age = age;
this.isStudent = isStudent;
this.courses = courses;
}
// getter方法(Gson需要通过反射访问属性,需提供getter)
public String getName() { return name; }
public int getAge() { return age; }
public boolean isStudent() { return isStudent; }
public String[] getCourses() { return courses; }
}
反向操作:从JSON字符串到数据(反序列化)
获取JSON字符串后,通常需要将其解析为编程语言原生数据类型,以便后续处理,以下是各语言的实现方法。
JavaScript:JSON.parse()
const jsonString = '{"name":"周九","age":22,"hobbies":["篮球","编程"]}';
// 解析为JavaScript对象
const obj = JSON.parse(jsonString);
console.log(obj.name); // 输出:周九
console.log(obj.hobbies[0]); // 输出:篮球
// 解析失败时抛出异常
try {
const invalidJson = "{'name':'吴十'}"; // 键名用单引号,格式错误
JSON.parse(invalidJson);
} catch (error) {
console.error("JSON解析失败:", error.message); // 输出:Unexpected token ' in JSON
}
Python:json.loads()
import json
json_string = '{"name":"郑十一","age":26,"isMarried":false,"pets":null}'
# 解析为Python字典
data = json.loads(json_string)
print(data["name"]) # 输出:郑十一
print(data["pets"]) # 输出:None
# 解析失败示例
try:
invalid_json = "{'name':'王十二'}" # 单引号包裹键名,错误
json.loads(invalid_json)
except json.JSONDecodeError as e:
print(f"JSON解析失败: {e}") # 输出:JSON解析失败: Expecting property name enclosed in double quotes
Java:Gson.fromJson()
import com.google.gson.Gson;
public class JsonParseExample {
public static void main(String[] args) {
String jsonString = "{\"name\":\"刘十三\",\"age\":23,\"isStudent\":true,\"courses\":[\"C++\",\"Go\"]}";


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