如何用Python操作JSON?json模块技巧

爱谁谁
发布: 2025-07-04 20:43:02
原创
551人浏览过

python操作json的核心是使用json模块的四个函数。1.json.loads()将json字符串转为python对象;2.json.dumps()将python对象转为json字符串,可设置indent美化格式;3.json.load()从文件读取json数据;4.json.dump()将python数据写入json文件。常见问题包括编码错误、数据类型不匹配和json解析异常,需注意ensure_ascii=false支持中文、处理布尔值与none的转换及捕获jsondecodeerror。对于嵌套结构,可通过链式访问逐层提取数据,结合.get()方法安全处理缺失字段。

如何用Python操作JSON?json模块技巧

在Python里操作JSON,其实远没有听起来那么复杂。核心就是利用Python自带的json模块,它能帮你轻松实现Python数据结构(比如字典和列表)与JSON字符串之间的转换。无论是从文件读取,还是把数据写入文件,亦或是直接处理内存中的字符串,json模块都提供了直观且强大的接口。

如何用Python操作JSON?json模块技巧

解决方案

要用Python操作JSON,你主要会用到json.loads()json.dumps()json.load()json.dump()这四个函数。

如何用Python操作JSON?json模块技巧
  • 从JSON字符串加载数据到Python对象:json.loads() 当你手头有一个JSON格式的字符串,想把它变成Python能理解的字典或列表时,loads(load string的缩写)就是你的首选。

    import json
    
    json_str = '{"name": "张三", "age": 30, "isStudent": false, "courses": ["Math", "Physics"]}'
    data = json.loads(json_str)
    print(data)
    print(type(data))
    # 输出:{'name': '张三', 'age': 30, 'isStudent': False, 'courses': ['Math', 'Physics']}
    # 输出:<class 'dict'>
    登录后复制
  • 将Python对象转换为JSON字符串:json.dumps() 反过来,如果你有一个Python字典或列表,想把它序列化成JSON格式的字符串,以便存储、传输或打印,dumps(dump string的缩写)就派上用场了。

    如何用Python操作JSON?json模块技巧
    import json
    
    py_dict = {
        "title": "Python JSON操作指南",
        "author": "一个爱折腾的开发者",
        "tags": ["Python", "JSON", "数据处理"],
        "version": 1.0
    }
    json_output = json.dumps(py_dict, indent=4, ensure_ascii=False) # indent用于美化输出,ensure_ascii=False支持中文
    print(json_output)
    # 输出:
    # {
    #     "title": "Python JSON操作指南",
    #     "author": "一个爱折腾的开发者",
    #     "tags": [
    #         "Python",
    #         "JSON",
    #         "数据处理"
    #     ],
    #     "version": 1.0
    # }
    登录后复制
  • 从JSON文件加载数据到Python对象:json.load() 处理文件时,load(注意没有's')能直接从打开的文件对象中读取JSON数据。这比先读取整个文件内容到字符串再用loads效率更高,也更方便。 假设你有一个名为data.json的文件,内容是:

    {
        "city": "北京",
        "temperature": 25,
        "forecast": ["晴", "多云"]
    }
    登录后复制
    import json
    
    try:
        with open('data.json', 'r', encoding='utf-8') as f:
            file_data = json.load(f)
            print(file_data)
            # 输出:{'city': '北京', 'temperature': 25, 'forecast': ['晴', '多云']}
    except FileNotFoundError:
        print("文件 data.json 不存在,请先创建。")
    登录后复制
  • 将Python对象写入JSON文件:json.dump() 要将Python对象直接写入JSON文件,使用dump。它会帮你处理文件写入的细节,同样可以指定indent参数让文件内容更易读。

    import json
    
    new_data = {
        "product": "智能音箱",
        "price": 399.99,
        "features": ["语音控制", "蓝牙连接", "智能家居"]
    }
    
    with open('output.json', 'w', encoding='utf-8') as f:
        json.dump(new_data, f, indent=4, ensure_ascii=False)
    print("数据已成功写入 output.json 文件。")
    # output.json 的内容会是格式化后的JSON
    登录后复制

Python处理JSON数据时常见的错误与应对策略

说实话,刚开始用Python处理JSON,踩坑是常有的事。最常见的几个问题,我个人经验来看,主要集中在编码、数据类型不匹配和错误处理上。

立即学习Python免费学习笔记(深入)”;

一个很典型的错误就是编码问题。当你从外部文件或网络请求获取JSON数据时,如果文件的编码不是UTF-8,或者你的程序没有正确指定编码,就很容易遇到UnicodeDecodeError。JSON标准建议使用UTF-8,所以我的习惯是,无论读写文件,都明确加上encoding='utf-8'。比如,open('file.json', 'r', encoding='utf-8')。这能省去很多不必要的麻烦。

再来是数据类型映射的理解偏差。Python的None在JSON里对应的是null,Python的True/False对应的是true/false。如果你不小心把Python的布尔值当字符串存进去,或者反过来期望JSON的null能直接被Python识别成某个特定值,就可能出问题。json模块会自动帮你处理这些基本类型的转换,但如果你在Python代码里构造数据时用了非JSON兼容的类型(比如set),json.dumps()就会抛出TypeError。这时候你就得手动转换,比如把set转成list

最后,也是我经常强调的,错误处理。不是所有的字符串都是合法的JSON。当json.loads()尝试解析一个格式错误的字符串时,它会抛出json.JSONDecodeError。所以,在实际项目中,尤其是在处理用户输入或外部API返回的数据时,一定要用try...except json.JSONDecodeError来捕获这个异常。这样可以防止程序崩溃,并给用户或日志提供有用的错误信息。

import json

malformed_json_str = '{"name": "Alice", "age": 30,' # 少了个 }

try:
    data = json.loads(malformed_json_str)
    print(data)
except json.JSONDecodeError as e:
    print(f"解析JSON失败:{e}")
    print("请检查JSON字符串的格式是否正确。")
# 输出:解析JSON失败:Expecting property name or '}' at line 1 column 28 (char 27)
# 输出:请检查JSON字符串的格式是否正确。
登录后复制

如何优雅地美化和格式化JSON输出?

让JSON输出变得“好看”或者说“易读”,是调试和日志记录时非常重要的一个环节。json模块提供了几个参数,能让你轻松实现这一点。我个人在调试或者需要把JSON内容粘贴到文档里时,都会用到它们。

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online

最常用的就是indent参数。当你把它设置为一个整数(比如4)时,json.dumps()json.dump()会在每个层级缩进指定数量的空格,并为每个键值对添加换行符,让JSON结构一目了然。

import json

complex_data = {
    "project": "AI助手",
    "developers": [
        {"name": "李华", "role": "前端"},
        {"name": "王明", "role": "后端", "skills": ["Python", "Django", "SQL"]}
    ],
    "status": "开发中",
    "milestones": {
        "phase1": "需求分析",
        "phase2": "原型设计",
        "phase3": "核心功能开发"
    }
}

# 不带缩进的输出,紧凑但难以阅读
print("--- 紧凑输出 ---")
print(json.dumps(complex_data, ensure_ascii=False))

# 带4个空格缩进的输出,非常易读
print("\n--- 格式化输出 (indent=4) ---")
print(json.dumps(complex_data, indent=4, ensure_ascii=False))
登录后复制

除了indent,还有一个sort_keys参数也很有用。当sort_keys设置为True时,输出的JSON中,字典的键会按照字母顺序排序。这对于需要比较两个JSON文件是否完全相同(例如,自动化测试中对比预期输出和实际输出),或者仅仅是为了保持输出的一致性,都非常有帮助。因为JSON对象中的键是无序的,不同次运行dumps可能会得到键顺序不同的字符串,sort_keys=True就能解决这个问题。

import json

data_to_sort = {
    "z_key": 1,
    "a_key": 2,
    "c_key": 3
}

print("\n--- 默认键顺序 (不保证) ---")
print(json.dumps(data_to_sort, indent=2))

print("\n--- 排序后的键顺序 ---")
print(json.dumps(data_to_sort, indent=2, sort_keys=True))
登录后复制

通过这些参数,你可以根据不同的场景需求,灵活地控制JSON输出的格式,让它们要么紧凑高效,要么清晰易读。

处理嵌套JSON数据有哪些技巧?

JSON数据结构最迷人的地方,就是它天然支持嵌套。一个键的值可以是另一个JSON对象,也可以是JSON数组,数组里面又可以包含JSON对象……这种层层叠叠的结构,在表示复杂关系时特别方便。但处理起来,有时候确实会让人感觉像在“剥洋葱”。

核心技巧就是链式访问。Python在把JSON解析成字典和列表后,你就可以像操作普通Python字典和列表一样,一层一层地访问下去。

import json

nested_json_str = """
{
    "company": "TechSolutions Inc.",
    "departments": [
        {
            "name": "研发部",
            "employees": [
                {"id": "001", "name": "王工程师", "projects": ["Project Alpha", "Project Beta"]},
                {"id": "002", "name": "李架构师", "projects": ["Project Gamma"]}
            ],
            "location": {"city": "上海", "building": "A座"}
        },
        {
            "name": "市场部",
            "employees": [
                {"id": "003", "name": "张经理", "campaigns": ["Spring Sale"]}
            ],
            "location": {"city": "北京", "building": "B座"}
        }
    ],
    "established_year": 2010
}
"""

data = json.loads(nested_json_str)

# 访问公司名称
print(f"公司名称: {data['company']}")

# 访问第一个部门的名称
first_department = data['departments'][0]
print(f"第一个部门: {first_department['name']}")

# 访问第一个部门的第二个员工的名字和项目
second_employee = first_department['employees'][1]
print(f"第二个员工: {second_employee['name']}, 参与项目: {second_employee['projects']}")

# 访问第二个部门的城市
second_department_city = data['departments'][1]['location']['city']
print(f"第二个部门所在城市: {second_department_city}")
登录后复制

当数据结构变得非常复杂,或者你不确定某个键是否存在时,使用字典的.get()方法会比直接用[]访问更安全。get()方法允许你提供一个默认值,当键不存在时返回这个默认值,而不是抛出KeyError。这在处理可能缺失字段的JSON数据时尤其有用。

# 假设我们想获取一个可能不存在的部门
try:
    non_existent_department = data['departments'][2] # 索引2不存在
    print(non_existent_department)
except IndexError:
    print("部门索引超出范围。")

# 使用 .get() 访问可能不存在的键
# 尝试获取一个不存在的员工ID
employee_id = data['departments'][0]['employees'][0].get('employee_id', 'N/A')
print(f"员工ID (可能不存在): {employee_id}") # 输出:员工ID (可能不存在): N/A

# 尝试获取一个不存在的部门名称,返回None
non_existent_dept_name = data.get('non_existent_department', {}).get('name')
print(f"不存在的部门名称: {non_existent_dept_name}") # 输出:不存在的部门名称: None
登录后复制

对于非常深层或结构不固定的JSON,你可能需要编写递归函数来遍历整个结构,或者考虑使用jsonpath这样的第三方库,它们提供了类似XPath的查询语言来定位JSON中的特定元素。但对于大多数日常任务,掌握链式访问和.get()方法,就已经足够应对了。

以上就是如何用Python操作JSON?json模块技巧的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号