python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python loads与load处理JSON数据

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

作者:知远漫谈

在现代编程中,数据交换和存储是开发过程中不可或缺的一环,JSON因其简洁、可读性强以及广泛支持的特点,已成为前后端通信、配置管理、数据持久化等场景下的首选格式之一,本文将带你深入探讨 json 模块中的两个核心方法——loads 与 load,需要的朋友可以参考下

引言

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

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

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

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

{
  "name": "Alice",
  "age": 28,
  "isStudent": false,
  "hobbies": ["reading", "coding", "traveling"],
  "address": {
    "city": "Beijing",
    "country": "China"
  }
}

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

二、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 等

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

三、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']

关键点:

多层嵌套结构解析实战

考虑一个复杂配置文件 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')

📊 通常结果会显示:loads 比 load 快 2~5 倍,因为后者涉及磁盘 I/O。

📌 结论:

九、最佳实践建议

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

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

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

记住一句话:

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

下一步建议:

以上就是Python使用loads与load处理JSON数据的方法的详细内容,更多关于Python loads与load处理JSON数据的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文