当前位置:首页>python>Python JSON字符串转字典 完整详细教程

Python JSON字符串转字典 完整详细教程

  • 2026-10-11 06:04:59
Python JSON字符串转字典 完整详细教程

一、核心模块:json

Python 内置 json 模块专门处理 JSON 与 Python 对象互转,**json.loads()** 负责:JSON字符串 → Python字典/列表。

核心方法区分

  1. json.loads(json_str):字符串 → Python 对象(字典/列表)
  2. json.load(file):JSON文件 → Python 对象
  3. json.dumps(dict):字典 → JSON字符串(反向操作)

二、基础语法

import json
# json_str:标准格式JSON字符串
python_dict = json.loads(json_str)

三、示例1:单层JSON对象(最常用)

JSON字符串格式要求

  • 键必须用双引号"key",不能单引号
  • 字符串值也必须双引号
  • 不能有注释、末尾逗号
import json

# 标准JSON字符串(双引号包裹键和值)
json_str = '{"name":"张三","age":22,"gender":"男","is_student":true,"score":95.5}'

# JSON字符串转字典
data_dict = json.loads(json_str)

print("转换后的类型:", type(data_dict))
print("完整字典:", data_dict)
print("取值name:", data_dict["name"])
print("取值age:", data_dict["age"])
print("布尔值:", data_dict["is_student"])

输出结果

转换后的类型: <class 'dict'>
完整字典: {'name': '张三', 'age': 22, 'gender': '男', 'is_student': True, 'score': 95.5}
取值name: 张三
取值age: 22
布尔值: True

类型映射规则(JSON → Python)

JSON 类型
Python 类型
object {}
dict
array []
list
string ""
str
number int
int
number 小数
float
true
True
false
False
null
None

四、示例2:JSON数组(数组字符串转列表,列表内含字典)

JSON 顶层是 [] 数组,转换后得到 list,列表元素为字典:

import json

# JSON数组字符串
json_arr_str = '''
[
    {"id": 1, "book": "Python入门"},
    {"id": 2, "book": "MySQL教程"},
    {"id": 3, "book": "前端开发"}
]
'''


data_list = json.loads(json_arr_str)
print("类型:", type(data_list))
print("全部数据:", data_list)
# 取第二个字典的书名
print(data_list[1]["book"])

输出:

类型: <class 'list'>
全部数据: [{'id': 1, 'book': 'Python入门'}, {'id': 2, 'book': 'MySQL教程'}, {'id': 3, 'book': '前端开发'}]
MySQL教程

五、示例3:嵌套复杂JSON(多层字典/数组)

接口返回的真实JSON大多多层嵌套:

import json

complex_json = '''
{
    "code": 200,
    "msg": "请求成功",
    "data": {
        "user_info": {
            "uid": 10001,
            "username": "lisi",
            "hobbies": ["篮球", "编程", "旅行"]
        },
        "article_list": [
            {"title": "JSON解析教程", "read": 1200},
            {"title": "Python基础", "read": 3500}
        ]
    }
}
'''


res_dict = json.loads(complex_json)

# 多层取值
print("状态码:", res_dict["code"])
print("用户名:", res_dict["data"]["user_info"]["username"])
print("第二个爱好:", res_dict["data"]["user_info"]["hobbies"][1])
print("第一篇文章标题:", res_dict["data"]["article_list"][0]["title"])

输出:

状态码: 200
用户名: lisi
第二个爱好: 编程
第一篇文章标题: JSON解析教程

六、常见报错与避坑重点

坑1:JSON使用单引号( loads 直接报错)

错误写法(Python字典字符串≠JSON):

import json
# 键是单引号,非法JSON
wrong_str = "{'name':'小明'}"
json.loads(wrong_str)  # 抛 json.JSONDecodeError

解决:

  1. 后端接口返回一定是双引号标准JSON;
  2. 如果本地只有单引号字符串,先用 eval()(不安全,不推荐)或替换引号:
wrong_str = "{'name':'小明'}"
fix_str = wrong_str.replace("'", '"')
d = json.loads(fix_str)
print(d)

坑2:JSON末尾多余逗号

# 最后一个键值对后有逗号,解析失败
error_json = '{"a":1,"b":2,}'
json.loads(error_json) # 报错

坑3:JSON带注释

标准JSON不支持 //、/* */ 注释,带注释直接解析报错。

坑4:中文乱码/转义字符

接口返回带 \uXXXX 中文转义,loads 自动还原中文,无需额外处理:

import json
escape_json = '{"title":"\u4e2d\u6587\u6d4b\u8bd5"}'
d = json.loads(escape_json)
print(d["title"]) # 输出:中文测试

七、拓展:loads 可选参数

1. object_hook:自定义字典转换

解析时对每个字典执行自定义函数:

import json

defconvert_user(d):
# 给用户对象新增字段
if"uid"in d:
        d["is_vip"] = False
return d

json_str = '{"uid": 1001, "name": "王五"}'
data = json.loads(json_str, object_hook=convert_user)
print(data)  # {'uid': 1001, 'name': '王五', 'is_vip': False}

2. parse_constant:处理特殊常量(NaN/Infinity)

标准JSON不支持NaN,如需解析添加参数:

import json

defhandle_constant(val):
if val == "NaN":
return0.0
return val

s = '{"num": NaN}'
d = json.loads(s, parse_constant=handle_constant)
print(d)

八、反向操作:字典转回JSON字符串(配套使用)

日常经常来回转换,补充对照:

import json

d = {"name": "小赵", "age": 25, "tags": ["技术", "阅读"]}
# 字典转JSON字符串
json_s = json.dumps(d, ensure_ascii=False, indent=2)
print(json_s)

参数说明:

  • ensure_ascii=False:中文不转义,正常显示
  • indent=2:格式化换行,方便阅读

九、实战场景:接口返回数据解析(模拟requests)

import json

# 模拟网络请求返回的json字符串
response_json = '''
{
    "status": 1,
    "data": {
        "token": "abc123xyz",
        "expire": 7200
    }
}
'''


# 解析为字典
resp = json.loads(response_json)
# 业务逻辑取值
if resp["status"] == 1:
    token = resp["data"]["token"]
    print("获取token:", token)

十、总结流程

  1. 导入内置模块 import json
  2. 准备标准双引号JSON字符串
  3. 使用 data = json.loads(json字符串) 转为字典/列表
  4. 通过 ["键名"] 多层取值操作数据
  5. 注意JSON语法规范:双引号、无多余逗号、无注释

需要我给你一份可直接复制的JSON解析异常捕获完整模板(包含try-except捕获解析错误)吗?

最新文章

随机文章