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

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

引言

在现代编程中,数据交换和存储是开发过程中不可或缺的一环。而 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数据的资料请关注脚本之家其它相关文章!

相关文章

  • Python实现的网页截图功能【PyQt4与selenium组件】

    Python实现的网页截图功能【PyQt4与selenium组件】

    这篇文章主要介绍了Python实现的网页截图功能,结合实例形式分别描述了使用PyQt4组件与selenium组件进行网页截图操作的相关实现技巧与注意事项,需要的朋友可以参考下
    2018-07-07
  • Python正则表达式语法及re模块中的常用函数详解

    Python正则表达式语法及re模块中的常用函数详解

    这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、查找和替换等操作,文章详细讲解了如何使用正则表达式进行匹配,,需要的朋友可以参考下
    2025-04-04
  • Python学习之sys模块使用教程详解

    Python学习之sys模块使用教程详解

    sys模块 与 os包一样,也是对系统资源进行调用。功能同样也是非常丰富。本文将对sys模块的一些简单且常用的函数进行介绍,感兴趣的可以学习一下
    2022-03-03
  • python面向对象多线程爬虫爬取搜狐页面的实例代码

    python面向对象多线程爬虫爬取搜狐页面的实例代码

    这篇文章主要介绍了python面向对象多线程爬虫爬取搜狐页面的实例代码,需要的朋友可以参考下
    2018-05-05
  • python使用PyV8执行javascript代码示例分享

    python使用PyV8执行javascript代码示例分享

    这篇文章主要介绍了python使用PyV8执行javascript的小示例,大家参考使用吧
    2013-12-12
  • Python echarts实现数据可视化实例详解

    Python echarts实现数据可视化实例详解

    这篇文章主要为大家详细介绍了Python echarts实现数据可视化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • python对execl 处理操作代码

    python对execl 处理操作代码

    这篇文章主要介绍了python对execl 处理操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Python实现基于二叉树存储结构的堆排序算法示例

    Python实现基于二叉树存储结构的堆排序算法示例

    这篇文章主要介绍了Python实现基于二叉树存储结构的堆排序算法,结合实例形式分析了Python二叉树的定义、遍历及堆排序算法相关实现技巧,需要的朋友可以参考下
    2017-12-12
  • Python小红书旋转验证码识别实战教程

    Python小红书旋转验证码识别实战教程

    这篇文章主要介绍了Python小红书旋转验证码识别实战教程,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-08-08
  • Python3.13 +Pycharm 开发环境配置

    Python3.13 +Pycharm 开发环境配置

    本文全面解释了如何配置Python3.13和PyCharm的开发环境,适合初学者,详细介绍了Python安装步骤、选择解释器、常用快捷键和推荐插件,强调了虚拟环境的重要性,以及如何使用PyCharm进行高效开发,感兴趣的可以了解一下
    2024-11-11

最新评论