JSON数据读写全攻略:从基础到实践
在当今的软件开发中,JSON(JavaScript Object Notation)已成为数据交换的主流格式之一,它以轻量、易读、易解析的特性,被广泛应用于前后端数据交互、API接口、配置文件等场景,JSON数据的读写,是开发者的必备技能,本文将从JSON的基础概念出发,详细讲解在不同编程语言(以Python和JavaScript为例)中如何读写JSON数据,并附上常见问题的解决方案。
JSON基础:什么是JSON?
JSON(JavaScript Object Notation)是一种基于JavaScript语言标准的数据格式,它采用“键值对”(Key-Value Pair)的方式组织数据,结构清晰,易于人阅读和机器解析,其核心语法规则包括:
-
数据类型:
- 简单类型:字符串(需用双引号包围)、数字、布尔值(
true
/false
)、null
。 - 复合类型:对象(用表示,键值对集合)、数组(用
[]
表示,有序值列表)。
- 简单类型:字符串(需用双引号包围)、数字、布尔值(
-
语法规则:
- 键必须用双引号()包围,值可以是上述任意类型。
- 数据项之间用逗号()分隔,最后一个数据项后无逗号。
- 对象和数组可以嵌套使用,形成复杂的数据结构。
示例JSON数据:
{ "name": "张三", "age": 25, "isStudent": false, "courses": [ {"subject": "数学", "score": 90}, {"subject": "英语", "score": 85} ], "address": null }
JSON数据的读取:解析与提取
读取JSON数据的核心是将JSON格式的字符串(或文件)转换为编程语言中的原生数据结构(如Python的字典/列表、JavaScript的对象/数组),以便后续处理,以下以Python和JavaScript为例说明。
Python中读取JSON数据
Python内置了json
模块,提供了json.loads()
(字符串解析)和json.load()
(文件解析)两个核心方法。
(1)从JSON字符串解析数据
使用json.loads()
(load string)将JSON字符串转换为Python字典或列表:
import json json_str = '{"name": "李四", "age": 30, "hobbies": ["reading", "coding"]}' data = json.loads(json_str) print(data["name"]) # 输出: 李四 print(data["hobbies"][0]) # 输出: reading
(2)从JSON文件读取数据
使用json.load()
从文件对象中读取JSON数据(假设文件名为data.json
):
import json with open("data.json", "r", encoding="utf-8") as f: data = json.load(f) print(data) # 输出文件中的JSON数据(Python字典格式)
注意事项:
- 文件需以UTF-8编码打开(避免中文乱码)。
- 如果JSON字符串格式错误(如缺少引号、逗号),会抛出
json.JSONDecodeError
异常。
JavaScript中读取JSON数据
JavaScript原生支持JSON解析,无需额外库,主要通过JSON.parse()
(字符串解析)和fetch API
(读取文件/网络数据)实现。
(1)从JSON字符串解析数据
使用JSON.parse()
将JSON字符串转换为JavaScript对象:
const jsonStr = '{"name": "王五", "age": 28, "skills": ["JavaScript", "Python"]}'; const data = JSON.parse(jsonStr); console.log(data.name); // 输出: 王五 console.log(data.skills[1]); // 输出: Python
(2)从文件读取JSON数据(Node.js环境)
在浏览器中,通常通过API接口获取JSON数据;在Node.js中,可通过fs
模块读取本地文件:
const fs = require('fs'); // 同步读取(适用于小文件) const jsonData = fs.readFileSync('data.json', 'utf8'); const data = JSON.parse(jsonData); console.log(data); // 异步读取(推荐,适用于大文件) fs.readFile('data.json', 'utf8', (err, jsonStr) => { if (err) throw err; const data = JSON.parse(jsonStr); console.log(data); });
注意事项:
JSON.parse()
要求字符串严格符合JSON格式(如属性名必须用双引号,否则会抛出SyntaxError
)。- 浏览器中若通过
fetch
获取JSON数据,需使用response.json()
方法(该方法返回Promise):fetch('https://api.example.com/data') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error));
JSON数据的写入:生成与保存
写入JSON数据的核心是将编程语言中的原生数据结构转换为JSON格式的字符串(或文件),以便存储或传输,核心方法是json.dumps()
(Python)和JSON.stringify()
(JavaScript)。
Python中写入JSON数据
(1)将数据转换为JSON字符串
使用json.dumps()
(dump string)将Python字典/列表转换为JSON字符串:
import json data = { "name": "赵六", "age": 22, "grades": [88, 92, 76] } json_str = json.dumps(data, ensure_ascii=False, indent=2) print(json_str) # 输出格式化后的JSON字符串(ensure_ascii=False支持中文,indent=2缩进美化)
(2)将数据写入JSON文件
使用json.dump()
将数据直接写入文件(推荐使用with
语句确保文件关闭):
import json data = { "name": "赵六", "age": 22, "grades": [88, 92, 76] } with open("output.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) # ensure_ascii=False避免中文转义,indent=2格式化
参数说明:
ensure_ascii=False
:允许非ASCII字符(如中文)直接输出,而非转义为\uXXXX
。indent=2
:格式化输出,缩进2个空格,提升可读性(若省略,JSON会以紧凑格式存储)。
JavaScript中写入JSON数据
(1)将数据转换为JSON字符串
使用JSON.stringify()
将JavaScript对象/数组转换为JSON字符串:
const data = { name: "钱七", age: 35, projects: ["Web开发", "数据分析"] }; // 基本转换 const jsonStr = JSON.stringify(data); console.log(jsonStr); // 输出紧凑格式: {"name":"钱七","age":35,"projects":["Web开发","数据分析"]} // 格式化输出(缩进2空格) const formattedJsonStr = JSON.stringify(data, null, 2); console.log(formattedJsonStr); /* 输出: { "name": "钱七", "age": 35, "projects": [ "Web开发", "数据分析" ] } */
(2)将数据写入JSON文件(Node.js环境)
通过fs
模块的writeFile
方法写入文件:
const fs = require('fs'); const data = { name: "钱七", age: 35, projects: ["Web开发", "数据分析"] }; // 同步写入 fs.writeFileSync('output.json', JSON.stringify(data, null, 2), 'utf8'); // 异步写入(推荐) fs.writeFile('output.json', JSON.stringify(data, null, 2), 'utf8', (err) => { if (err) throw err; console.log('JSON文件已写入'); });
参数说明:
JSON.stringify(data, replacer, space)
:replacer
:可选,用于过滤或转换数据(如函数可指定只保留某些属性)。space
:可选,格式化缩进(数字表示空格数,或字符串如"\t"
表示制表符)。
常见问题与解决方案
中文乱码问题
- Python:确保文件以
encoding="utf-8"
打开/写入,并使用ensure_ascii=False
。 - JavaScript:文件读写时指定
utf8
编码(Node.js中fs
模块默认支持)。
数据类型不匹配
- Python的
json
模块会将True
/False
/null
分别转换为True
/False
/None
,JavaScript中则对应true
/false
/null
,需注意语言差异。 - 日期
还没有评论,来说两句吧...