JSON字符串解析全攻略:从基础到实战
在数据交互日益频繁的今天,JSON(JavaScript Object Notation)已成为轻量级数据交换的主流格式,无论是前端从后端获取数据,还是不同系统间的数据传递,JSON字符串的身影无处不在,但拿到一串看似杂乱的JSON字符串后,怎么把它解析成可用的数据结构,成了许多开发者(尤其是新手)的常见难题,本文将从JSON的基础概念出发,详解不同编程语言中解析JSON字符串的方法,并通过实例带你解析技巧,最后总结常见问题与解决方案。
先搞懂:什么是JSON字符串?
要解析JSON字符串,得先明白它到底是什么,JSON是一种键值对的数据组织格式,结构清晰,易于机器解析和生成,也方便人类阅读,它的基本语法规则包括:
- 数据以键值对形式存在,如
{"name": "张三", "age": 18}; - 键必须用双引号()包裹,值可以是字符串、数字、布尔值、数组、对象或null;
- 数组用方括号(
[])表示,如["apple", "banana", "orange"]; - 多个键值对或数组元素之间用逗号()分隔,最后一个元素后不加逗号。
JSON字符串:特指用单引号()或双引号()包裹的、符合JSON格式的文本数据。
'{"name": "李四", "hobbies": ["reading", "coding"], "isStudent": true}'
注意:它本质上是字符串,不是直接可用的对象或数组,因此需要通过解析工具转换成编程语言中的原生数据类型(如Python的字典/列表、JavaScript的对象/数组等)。
核心操作:如何解析JSON字符串?
解析JSON字符串的核心目标是:将文本格式的JSON数据转换成编程语言中的原生数据结构,不同语言提供了不同的API或库,但原理大同小异,下面以主流语言为例,详解具体方法。
(一)JavaScript/TypeScript:原生API与解析技巧
JavaScript作为JSON的“发源地”,解析JSON字符串非常方便,主要通过 JSON 对象的两个方法实现。
解析JSON字符串:JSON.parse()
JSON.parse() 用于将JSON字符串转换成JavaScript对象或数组。
语法:JSON.parse(text[, reviver])
text:必需,要解析的JSON字符串。reviver:可选,转换函数,可对解析后的值进行二次处理。
示例:
const jsonString = '{"name": "王五", "age": 25, "courses": ["math", "english"]}';
// 解析为对象
const data = JSON.parse(jsonString);
console.log(data); // 输出:{ name: '王五', age: 25, courses: [ 'math', 'english' ] }
console.log(data.name); // 输出:王五
console.log(data.courses[0]); // 输出:math
// 使用reviver函数(将年龄转为字符串)
const dataWithReviver = JSON.parse(jsonString, (key, value) => {
if (key === 'age') return String(value);
return value;
});
console.log(typeof dataWithReviver.age); // 输出:string
注意事项:
- JSON字符串必须严格符合JSON格式(如键必须用双引号,不能用单引号;不能有注释等),否则会抛出
SyntaxError。 - 如果解析的是JSON数组,
JSON.parse()会返回JavaScript数组。const jsonArrayString = '[1, 2, {"a": 3}]'; const arr = JSON.parse(jsonArrayString); console.log(arr[2].a); // 输出:3
将对象/数组转JSON字符串:JSON.stringify()(反向操作)
虽然本文重点是“解析”,但 JSON.stringify() 是“序列化”的逆过程,了解它能更好理解JSON格式:
const obj = { name: "赵六", age: 30 };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // 输出:{"name":"赵六","age":30}
(二)Python:json模块的标准操作
Python内置了 json 模块专门处理JSON数据,通过 json.loads() 和 json.dump() 实现字符串与Python对象的转换。
解析JSON字符串:json.loads()
json.loads() 是 “load string” 的缩写,用于将JSON字符串解析为Python的字典(dict)或列表(list)。
语法:json.loads(s[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]])
- 最常用的是
s(JSON字符串)和object_hook(自定义解析函数,用于将字典转为指定对象)。
示例:
import json
json_string = '{"name": "钱七", "age": 28, "hobbies": ["travel", "photography"]}'
# 解析为字典
data = json.loads(json_string)
print(data) # 输出:{'name': '钱七', 'age': 28, 'hobbies': ['travel', 'photography']}
print(data["name"]) # 输出:钱七
print(data["hobbies"][0]) # 输出:travel
# 解析JSON数组
json_array_string = '[{"id": 1, "city": "Beijing"}, {"id": 2, "city": "Shanghai"}]'
data_list = json.loads(json_array_string)
print(data_list[0]["city"]) # 输出:Beijing
# 使用object_hook(将字典转为自定义类)
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name={self.name}, age={self.age})"
def dict_to_person(d):
if "name" in d and "age" in d:
return Person(d["name"], d["age"])
return d
data_with_hook = json.loads(json_string, object_hook=dict_to_person)
print(data_with_hook) # 输出:Person(name=钱七, age=28)
注意事项:
- JSON中的
true/false/null会被解析为Python的True/False/None。 - 如果JSON字符串格式错误(如单引号包裹键、逗号多余等),会抛出
json.JSONDecodeError。
将Python对象转JSON字符串:json.dumps()(反向操作)
import json
person_dict = {"name": "孙八", "age": 35}
json_str = json.dumps(person_dict, ensure_ascii=False) # ensure_ascii=False支持中文
print(json_str) # 输出:{"name": "孙八", "age": 35}
(三)Java:使用 Jackson 或 Gson 库
Java没有内置的JSON解析方法,需要借助第三方库,最常用的是 Jackson 和 Gson,这里以 Jackson 为例(Maven依赖:com.fasterxml.jackson.core:jackson-databind:2.13.0)。
解析JSON字符串:ObjectMapper.readValue()
ObjectMapper 是Jackson的核心类,readValue() 方法可将JSON字符串解析为Java对象或集合。
示例:
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonParseExample {
public static void main(String[] args) throws Exception {
String jsonString = "{\"name\": \"周九\", \"age\": 40, \"skills\": [\"Java\", \"Python\"]}";
ObjectMapper objectMapper = new ObjectMapper();
// 解析为自定义对象(需先定义实体类)
Person person = objectMapper.readValue(jsonString, Person.class);
System.out.println(person.getName()); // 输出:周九
System.out.println(person.getSkills().get(0)); // 输出:Java
// 解析为Map
java.util.Map<String, Object> map = objectMapper.readValue(jsonString, java.util.Map.class);
System.out.println(map.get("age")); // 输出:40
}
}
// Person实体类(需与JSON键名一致)
class Person {
private String name;
private int age;
private java.util.List<String> skills;
// 必须提供无参构造函数
public Person() {}
// getter和setter方法
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public java.util.List<String> getSkills() { return skills; }
public void setSkills(java.util.List<String> skills) { this.skills = skills; }
}
注意事项:



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