当前位置: 代码网 > it编程>前端脚本>Python > Python使用loads与load处理JSON数据的方法

Python使用loads与load处理JSON数据的方法

2026年07月30日 Python 我要评论
引言在现代编程中,数据交换和存储是开发过程中不可或缺的一环。而 json(javascript object notation) 作为一种轻量级的数据格式,因其简洁、可读性强以及广泛支持的特点,已成为

引言

在现代编程中,数据交换和存储是开发过程中不可或缺的一环。而 json(javascript object notation) 作为一种轻量级的数据格式,因其简洁、可读性强以及广泛支持的特点,已成为前后端通信、配置管理、数据持久化等场景下的首选格式之一。作为python开发者,掌握如何高效、正确地读取和解析json数据,是提升代码质量与系统健壮性的关键技能。

本文将带你深入探讨 json 模块中的两个核心方法——loadsload。我们将从它们的基本用法出发,逐步剖析两者的差异、适用场景,并通过大量真实示例展示如何在实际项目中灵活运用。同时,我们还会引入 mermaid 图表来可视化数据流过程,帮助你更直观地理解底层逻辑。

一、什么是json?为什么它如此流行?

定义:json 是一种基于文本的、用于存储和传输数据的格式,其语法源自 javascript 对象字面量,但独立于语言,被几乎所有主流编程语言支持。

{
  "name": "alice",
  "age": 28,
  "isstudent": false,
  "hobbies": ["reading", "coding", "traveling"],
  "address": {
    "city": "beijing",
    "country": "china"
  }
}

这段代码就是一个典型的 json 数据结构。它的特点包括:

  • 人类可读性强:结构清晰,易于阅读。
  • 机器解析效率高:大多数语言都有原生支持。
  • 跨平台兼容性好:无论是在 web 前端、后端服务还是移动应用中都能无缝对接。

二、python中的json模块简介

python 内置了 json 模块,无需额外安装即可使用。它提供了丰富的功能来处理 json 数据的 序列化(编码)反序列化(解码)

方法 功能输入类型输出类型
json.dumps()将 python 对象转为 json 字符串dict, list, str, int 等str
json.dump()将 python 对象写入文件(序列化)dict, list 等file object
json.loads()将 json 字符串解析为 python 对象strdict, list 等
json.load()从文件中读取 json 并解析为 python 对象file objectdict, list 等

重点提醒:loadsload 都用于“读取”操作,但一个针对字符串,一个针对文件。

三、json.loads()—— 从字符串解析json

语法结构

json.loads(s, *, encoding=none, cls=none, parse_float=none, parse_int=none, parse_constant=none, object_hook=none, parse_object=none, object_pairs_hook=none, use_decimal=false, kwarg)

最常用的参数只有 s:即要解析的 json 字符串。

示例1:基础使用

import json

json_string = '''
{
  "name": "bob",
  "skills": ["python", "django", "rest api"],
  "experience": 5,
  "active": true
}
'''

data = json.loads(json_string)
print(type(data))  # <class 'dict'>
print(data['name'])  # bob
print(data['skills'])  # ['python', 'django', 'rest api']

这里 json.loads() 成功将一段字符串转换成了 python 字典对象,便于后续程序处理。

实际应用场景:api响应数据处理

假设我们调用一个天气查询接口,返回如下内容(模拟):

api_response = '''
{
  "location": "shanghai",
  "temperature": 23.5,
  "humidity": 60,
  "forecast": [
    {"day": "today", "high": 25, "low": 19},
    {"day": "tomorrow", "high": 27, "low": 21}
  ],
  "status": "ok"
}
'''

weather_data = json.loads(api_response)

print(f"当前城市: {weather_data['location']}")
print(f"今日最高气温: {weather_data['forecast'][0]['high']}°c")

✅ 输出:

当前城市: shanghai
今日最高气温: 25°c

这种方式常用于处理来自 restful api、webhook 或第三方服务的响应体。

与dumps配合使用:数据流转验证

import json

original_data = {"user": "charlie", "role": "admin", "permissions": ["read", "write", "delete"]}

# 转换为 json 字符串
json_str = json.dumps(original_data, indent=4)
print("原始数据 → json:")
print(json_str)

# 再次解析回字典
recovered_data = json.loads(json_str)
print("\njson → 恢复数据:")
print(recovered_data)

# 验证是否一致
assert original_data == recovered_data
print("✅ 数据一致性校验通过!")

这说明 loads 可以完美还原原始结构,是实现数据持久化或网络传输的重要环节。

四、json.load()—— 从文件读取并解析json

语法结构

json.load(fp, *, cls=none, parse_float=none, parse_int=none, parse_constant=none, object_hook=none, parse_object=none, object_pairs_hook=none, use_decimal=false, **kw)

这里的 fp 是一个打开的文件对象(必须是可读的),而不是字符串。

示例2:读取本地json文件

创建一个名为 config.json 的文件:

{
  "database": {
    "host": "localhost",
    "port": 5432,
    "name": "myapp_db",
    "username": "admin"
  },
  "debug_mode": true,
  "max_connections": 100,
  "allowed_hosts": [
    "127.0.0.1",
    "localhost"
  ]
}

然后在 python 中读取它:

import json

with open('config.json', 'r', encoding='utf-8') as file:
    config = json.load(file)

print(config['database']['host'])  # localhost
print(config['debug_mode'])        # true
print(config['allowed_hosts'])    # ['127.0.0.1', 'localhost']

关键点

  • 必须使用 with open(...) 上下文管理器,确保文件正确关闭。
  • 文件编码建议指定为 utf-8,避免中文乱码问题。

多层嵌套结构解析实战

考虑一个复杂配置文件 settings.json

{
  "app": {
    "name": "mysuperapp",
    "version": "1.2.0",
    "features": {
      "auth": true,
      "analytics": false,
      "notifications": true
    }
  },
  "logging": {
    "level": "info",
    "file": "/var/log/app.log",
    "retention_days": 30
  },
  "cache": {
    "type": "redis",
    "servers": [
      {"host": "redis1.example.com", "port": 6379},
      {"host": "redis2.example.com", "port": 6379}
    ]
  }
}

解析并提取信息:

import json

with open('settings.json', 'r', encoding='utf-8') as f:
    settings = json.load(f)

# 访问深层字段
app_name = settings["app"]["name"]
auth_enabled = settings["app"]["features"]["auth"]
redis_server = settings["cache"]["servers"][0]["host"]

print(f"应用名称: {app_name}")
print(f"认证功能是否开启: {auth_enabled}")
print(f"redis 主机: {redis_server}")

输出:

应用名称: mysuperapp
认证功能是否开启: true
redis 主机: redis1.example.com

这正是生产环境中常见的配置管理方式。

五、loadsvsload:到底有什么区别?

让我们用一张 mermaid 流程图 来形象对比两者的差异!

渲染错误: mermaid 渲染失败: parse error on line 2: ...->|字符串| b{json.loads()} a -->|文件对象| -----------------------^ expecting 'sqe', 'doublecircleend', 'pe', '-)', 'stadiumend', 'subroutineend', 'pipe', 'cylinderend', 'diamond_stop', 'tagend', 'trapend', 'invtrapend', 'unicode_text', 'text', 'tagstart', got 'ps'

👉 总结对比表

特性json.loads()json.load()
输入类型json 字符串 (str)打开的文件对象 (file)
是否需要打开文件❌ 否✅ 是
性能表现极快(内存操作)较慢(涉及i/o)
适用场景api响应、字符串变量、测试数据配置文件、数据库导出、日志分析
错误提示语法错误时抛出 jsondecodeerror文件不存在或读取失败时抛异常

小贴士:如果你已经有一个 json 字符串,不要用 load();反之,如果要读取文件,就不能用 loads()

六、常见错误与异常处理

错误1:对文件使用loads()

with open('data.json', 'r') as f:
    content = f.read()
    # 错误:不能把 file object 传给 loads
    data = json.loads(f)  # 报错!typeerror

✅ 正确做法:

with open('data.json', 'r', encoding='utf-8') as f:
    content = f.read()
    data = json.loads(content)  # ok

错误2:对字符串使用load()

json_str = '{"name": "david"}'
# 错误:load 接收的是文件对象,不是字符串
data = json.load(json_str)  # typeerror: not a valid file object

✅ 正确做法:

data = json.loads(json_str)  # ok

异常捕获最佳实践

import json

def read_json_file(filename):
    try:
        with open(filename, 'r', encoding='utf-8') as f:
            return json.load(f)
    except filenotfounderror:
        print(f"❌ 文件 {filename} 未找到!")
        return none
    except json.jsondecodeerror as e:
        print(f"❌ json 解析失败:{e}")
        return none
    except exception as e:
        print(f"❌ 其他错误:{e}")
        return none

# 调用
config = read_json_file("config.json")
if config:
    print("✅ 配置加载成功!")
else:
    print("❌ 加载失败,检查文件或格式。")

📌 这种模式在真实项目中非常实用,能有效防止程序因异常中断。

七、高级技巧:自定义解析行为

1. 通过object_hook自定义对象构造

默认情况下,json 对象会被映射为 python 字典。但你可以通过 object_hook 改变这一行为。

import json
from datetime import datetime

def custom_object_hook(dct):
    # 检查是否有 date 字段
    if 'created_at' in dct:
        dct['created_at'] = datetime.fromisoformat(dct['created_at'])
    return dct

json_data = '''
{
  "user": "eva",
  "created_at": "2025-04-05t10:30:00"
}
'''

result = json.loads(json_data, object_hook=custom_object_hook)
print(result['created_at'])  # 2025-04-05 10:30:00
print(type(result['created_at']))  # <class 'datetime.datetime'>

🎉 这样就可以自动将时间字符串转换为 datetime 类型,极大简化后续处理。

2. 用parse_float/parse_int控制数值精度

某些场景下,你可能希望将浮点数保留更多位数,或者强制使用 decimal.decimal

import json
from decimal import decimal

json_text = '{"price": 19.99, "tax": 1.999}'

# 强制使用 decimal
data = json.loads(json_text, parse_float=decimal)
print(data['price'])  # decimal('19.99')
print(type(data['price']))  # <class 'decimal.decimal'>

👉 适用于金融计算、精确金额处理等要求高精度的场景。

八、性能对比:loadsvsload哪个更快?

我们来做一个简单的性能测试:

import json
import time

# 准备测试数据
large_json_str = json.dumps({"items": [i for i in range(10000)]}, indent=2)

# 测试 loads 性能
start = time.time()
for _ in range(1000):
    json.loads(large_json_str)
loads_time = time.time() - start

# 测试 load 性能(需临时写文件)
with open('temp.json', 'w', encoding='utf-8') as f:
    f.write(large_json_str)

start = time.time()
for _ in range(1000):
    with open('temp.json', 'r', encoding='utf-8') as f:
        json.load(f)
load_time = time.time() - start

print(f"json.loads() 耗时: {loads_time:.4f} 秒")
print(f"json.load() 耗时: {load_time:.4f} 秒")

# 清理临时文件
import os
os.remove('temp.json')

📊 通常结果会显示:loadsload2~5 倍,因为后者涉及磁盘 i/o。

📌 结论

  • 优先使用 loads() 处理已知字符串。
  • 仅当数据来自文件时才使用 load()

九、最佳实践建议

  1. 明确输入来源:区分是字符串?还是文件?
  2. 始终指定 encoding=‘utf-8’:避免中文乱码。
  3. 使用 with open() 管理文件资源
  4. 加入异常处理:尤其是 jsondecodeerror
  5. 合理使用 object_hook:提升数据可用性。
  6. 避免重复解析:如多次调用 loads,可缓存结果。

 十、结语:掌握这两招,轻松驾驭json世界!

无论是构建 web 应用、自动化脚本,还是数据分析项目,json.loads()json.load() 都是你每天都会用到的核心工具。掌握它们的区别、优势与陷阱,不仅能让你写出更健壮的代码,还能显著提高开发效率。

记住一句话

loads 是字符串的解码器,load 是文件的解码器。”
—— 你的 python 工具箱里,这两个方法缺一不可!

下一步建议:

  • 学习 json.dumps()dump() 的反向操作。
  • 探索 jsonschema 模块进行数据验证。
  • 尝试结合 requests 模块处理 api 返回的 json。

以上就是python使用loads与load处理json数据的方法的详细内容,更多关于python loads与load处理json数据的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com