JSON字符串处理全攻略:从解析到实战应用
在数据交互日益频繁的今天,JSON(JavaScript Object Notation)已成为前后端通信、配置文件存储、API数据交换的主流格式,无论是接收后端返回的API响应,还是读取本地配置文件,我们常常需要处理“JSON字符串”——即以字符串形式存储的JSON数据,如何高效、安全地将JSON字符串转换为可操作的对象或数组,又如何将对象/数组还原为JSON字符串?本文将围绕“JSON字符串怎么处理”这一核心问题,从基础概念到实战场景,为你详细拆解处理流程与最佳实践。
什么是JSON字符串?为什么需要处理它?
JSON字符串本质上是一个符合JSON格式规范的字符串。'{"name":"张三","age":25,"hobbies":["阅读","编程"]}',它用单引号或双引号包裹,内部遵循JSON的键值对结构(键必须为双引号,值可以是字符串、数字、布尔值、数组、null或嵌套对象)。
为什么需要处理?
计算机无法直接理解字符串中的数据结构——比如我们不能通过'{"name":"张三"}'.name获取“张三”,因为字符串只是文本,不具备对象的属性访问能力,处理JSON字符串的核心目标,就是将其“反序列化”(解析)为编程语言中的原生对象(如JavaScript的Object、Python的dict),让我们能读取、修改数据;反之,当需要将数据传递给其他系统时,还需将对象“序列化”为JSON字符串,确保格式统一、可跨语言解析。
处理JSON字符串的核心步骤:解析与序列化
处理JSON字符串的核心流程分为两步:解析(反序列化)和序列化,不同编程语言提供了内置方法或库来支持这两步操作,下面以最常用的JavaScript和Python为例,展开具体说明。
(一)解析JSON字符串:将字符串转为对象/数组
解析JSON字符串,就是将符合JSON格式的文本转换为编程语言中的原生数据结构。
JavaScript:JSON.parse()
JavaScript中,使用全局对象JSON的parse()方法解析JSON字符串:
const jsonString = '{"name":"张三","age":25,"hobbies":["阅读","编程"]}';
// 解析为JavaScript对象
const obj = JSON.parse(jsonString);
console.log(obj.name); // 输出:张三
console.log(obj.hobbies[0]); // 输出:阅读
// 处理嵌套JSON
const nestedJson = '{"user":{"id":1,"email":"zhangsan@example.com"},"is_active":true}';
const nestedObj = JSON.parse(nestedJson);
console.log(nestedObj.user.email); // 输出:zhangsan@example.com
注意事项:
- JSON字符串中的键必须用双引号包裹(单引号会报错);
parse()方法要求字符串严格符合JSON格式,否则会抛出SyntaxError(如未闭合的引号、多余的逗号等);- 可传入第二个参数(
reviver函数)对解析结果进行预处理,const dateJson = '{"created":"2023-10-01T12:00:00Z"}'; const objWithDate = JSON.parse(dateJson, (key, value) => { if (key === 'created') return new Date(value); // 将日期字符串转为Date对象 return value; }); console.log(objWithDate.created instanceof Date); // 输出:true
Python:json.loads()
Python中,使用json模块的loads()(load string)方法解析JSON字符串:
import json
json_string = '{"name":"张三","age":25,"hobbies":["阅读","编程"]}'
# 解析为Python字典
obj = json.loads(json_string)
print(obj["name"]) # 输出:张三
print(obj["hobbies"][0]) # 输出:阅读
# 处理嵌套JSON
nested_json = '{"user":{"id":1,"email":"zhangsan@example.com"},"is_active":true}'
nested_obj = json.loads(nested_json)
print(nested_obj["user"]["email"]) # 输出:zhangsan@example.com
注意事项:
-
Python解析后得到的是字典(
dict)或列表(list),与JavaScript的Object/Array对应; -
同样要求字符串严格符合JSON格式(双引号键、规范值);
-
可通过
object_hook参数自定义解析逻辑,例如将特定字典转为自定义类:class User: def __init__(self, id, email): self.id = id self.email = email def user_decoder(obj): if "id" in obj and "email" in obj: return User(obj["id"], obj["email"]) return obj nested_obj = json.loads(nested_json, object_hook=user_decoder) print(nested_obj.user.id) # 输出:1(需确保返回User对象后通过属性访问)
(二)序列化JSON字符串:将对象/数组转为字符串
序列化是将编程语言中的对象/数组转换为JSON字符串的过程,常用于数据存储或API请求。
JavaScript:JSON.stringify()
JavaScript中使用JSON.stringify()方法将对象转为JSON字符串:
const obj = {
name: "张三",
age: 25,
hobbies: ["阅读", "编程"]
};
// 基本序列化
const jsonString = JSON.stringify(obj);
console.log(jsonString);
// 输出:{"name":"张三","age":25,"hobbies":["阅读","编程"]}
// 格式化输出(缩进2个空格)
const formattedJson = JSON.stringify(obj, null, 2);
console.log(formattedJson);
/*
输出:
{
"name": "张三",
"age": 25,
"hobbies": [
"阅读",
"编程"
]
}
*/
// 过滤属性(只保留name和hobbies)
const filteredJson = JSON.stringify(obj, ["name", "hobbies"]);
console.log(filteredJson); // 输出:{"name":"张三","hobbies":["阅读","编程"]}
注意事项:
stringify()会跳过对象中的函数和undefined值(例如{name:"张三", sayHi: function(){}}序列化后不包含sayHi);- 可传入第三个参数(缩进量)或替换函数(
replacer)自定义序列化结果,例如处理循环引用:const obj = { name: "张三" }; obj.self = obj; // 循环引用 try { JSON.stringify(obj); // 抛出错误:Converting circular structure to JSON } catch (e) { console.log("循环引用无法序列化"); }
Python:json.dumps()
Python中使用json模块的dumps()(dump string)方法将字典/列表转为JSON字符串:
import json
obj = {
"name": "张三",
"age": 25,
"hobbies": ["阅读", "编程"]
}
# 基本序列化
json_string = json.dumps(obj)
print(json_string)
# 输出:{"name": "张三", "age": 25, "hobbies": ["阅读", "编程"]}
# 格式化输出(缩进2个空格)
formatted_json = json.dumps(obj, indent=2)
print(formatted_json)
"""
输出:
{
"name": "张三",
"age": 25,
"hobbies": [
"阅读",
"编程"
]
}
"""
# 处理中文(默认ASCII编码,需ensure_ascii=False)
chinese_obj = {"城市": "北京"}
json_string_chinese = json.dumps(chinese_obj, ensure_ascii=False)
print(json_string_chinese) # 输出:{"城市": "北京"}
注意事项:
-
Python的
dumps()默认将非ASCII字符(如中文)转为Unicode转义(如\u5317\u4eac),需设置ensure_ascii=False保留原字符; -
可通过
default参数处理非JSON原生类型(如datetime),from datetime import datetime obj = {"time": datetime.now()} json_string = json.dumps(obj, default=str) # 将datetime转为字符串 print(json_string) # 输出:{"time": "2023-10-01 12:00:00.123456"}
实战场景:处理JSON字符串的常见问题
(一)如何处理API返回的JSON字符串?
前后端交互时,后端通常返回JSON格式的响应数据(如'{"code":200,"data":{"id":1,"name":"商品A"}}'),处理步骤如下(



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