Python中json的dumps,dump,loads,load四个方法区别

原文

常用json就知道,json模块提供了四个常用的方法:dumps、dump、loads、load,用于字符串 和 python数据类型间进行转换。下面我们一一来看:

1. json.loads()

把Json格式字符串解码转换成Python对象 从json到python的类型转化对照如下:

# json_loads.py 
strDict = '{"city": "北京", "name": "大猫"}' 
# [1, 2, 3, 4] 
# json数据自动按Unicode存储 
# {u'city': u'\u5317\u4eac', u'name': u'\u5927\u732b'} 
  •  

2. json.dumps()

  实现python类型转化为json字符串,返回一个str对象 把一个Python对象编码转换成Json字符串
从python原始类型向json类型的转化对照如下:

建立新文件名:json_dumps.py

import json
import chardet 
listStr = [1, 2, 3, 4] 
tupleStr = (1, 2, 3, 4) 
dictStr = {"city": "北京", "name": "大猫"} 
json.dumps(listStr) # '[1, 2, 3, 4]' 
json.dumps(tupleStr) # '[1, 2, 3, 4]' 
# 注意:json.dumps() 处理中文时默认使用的ascii编码,会导致中文无法正常显示 
print json.dumps(dictStr) 
# 记住:处理中文时,添加参数 ensure_ascii=False 来禁用ascii编码 
print json.dumps(dictStr, ensure_ascii=False) 
# {"city": "北京", "name": "大刘"} 
json.dumps(res, indent=2, sort_keys=True)格式化输出并按键排序。
  •  

3. json.dump()

  将Python内置类型序列化为json对象后写入文件
# json_dump.py
listStr = [{“city”: “北京”}, {“name”: “大刘”}]
dictStr = {“city”: “北京”, “name”: “大刘”} json.dump(dictStr,
open(“dictStr.json”,”w”), ensure_ascii=False)

4. json.load()

  读取文件中json形式的字符串元素 转化成python类型

# json_load.py 
strList = json.load(open("listStr.json")) 
print strList 
print strDict 
# {u'city': u'\u5317\u4eac', u'name': u'\u5927\u5218'} 
<think>嗯,用户之前问了关于如何判断字典类型的问题,现在他们又在问关于jsondumpdumpsloadloads这几个函数。看起来他们可能在处理数据序列化或者API交互的时候遇到了问题,需要了解如何将Python对象转换成JSON格式,或者反过来。 首先,我需要回忆一下json模块这几个函数的区别。用户可能分不清这四个函数的不同用途,特别是dumpdumpsloadloads之间的区别。通常,带s的函数(dumpsloads)是处理字符串的,而不带s的则是处理文件操作的。 接下来,我需要确定用户的使用场景。他们可能需要在保存数据到文件时使用dump,或者在网络传输中使用dumps将数据转为字符串。同样,读取文件时用load,而解析字符串数据用loads。需要明确每个函数的参数示例,让用户更容易理解。 另外,用户可能会对ensure_ascii参数、indent美化输出这些细节感兴趣,或者遇到日期时间等不可序列化对象的处理问题。需要提到这些常见问题,并提供解决方法,比如使用default参数或者自定义编码器。 还要注意用户可能的错误,比如尝试序列化非基本类型的数据,或者文件操作时的模式错误(比如忘记用写入模式打开文件)。在注意事项里应该提醒这些点,帮助他们避免常见的坑。 最后,是否需要扩展其他内容?比如提到性能方面的考虑,或者与其他序列化方式的对比?不过根据问题范围,可能不需要,但可以简要提到处理复杂对象的方法,比如自定义JSONEncoder。这样用户有一个全面的了解,知道如何应对更复杂的情况。</think>在 Python 中处理 JSON 数据时,`json` 模块提供了四个核心方法,它们的区别应用场景如下: --- ### 核心方法对比表 | 方法 | 方向 | 输入/输出 | 典型应用场景 | |------|------|----------|-------------| | `dumps()` | 序列化 | 对象 → JSON字符串 | 将 Python 对象转换为网络传输/存储的字符串 | | `dump()` | 序列化 | 对象 → 文件流 | 直接将 Python 对象写入文件 | | `loads()` | 反序列化 | JSON字符串 → 对象 | 将字符串解析为 Python 对象 | | `load()` | 反序列化 | 文件流 → 对象 | 直接从文件读取并解析为 Python 对象 | --- ### 1. json.dumps() - 对象转字符串 ```python import json data = { "name": "张三", "age": 25, "skills": ["Python", "SQL"] } # 基本用法 json_str = json.dumps(data) print(type(json_str)) # <class 'str'> # 美化输出(缩进+中文不转义) pretty_str = json.dumps(data, indent=2, ensure_ascii=False) ``` --- ### 2. json.dump() - 对象写入文件 ```python # 写入文件(自动处理编码) with open('data.json', 'w', encoding='utf-8') as f: json.dump(data, f, indent=2, ensure_ascii=False) ``` --- ### 3. json.loads() - 字符串转对象 ```python # 解析 JSON 字符串 received_str = '{"city": "北京", "temp": 28.5}' parsed_data = json.loads(received_str) print(parsed_data['city']) # 北京 ``` --- ### 4. json.load() - 文件转对象 ```python # 从文件读取 with open('data.json', 'r', encoding='utf-8') as f: loaded_data = json.load(f) ``` --- ### 关键参数说明 | 参数 | 作用 | 示例值 | |------|------|-------| | `indent` | 缩进美化 | 2(空格数) | | `ensure_ascii` | 中文字符处理 | False(显示中文) | | `sort_keys` | 键排序 | True(按字母排序) | | `default` | 处理不可序列化对象 | 自定义处理函数 | --- ### 常见问题处理 #### 处理日期对象 ```python from datetime import datetime def custom_serializer(obj): if isinstance(obj, datetime): return obj.isoformat() raise TypeError("Type not serializable") data = {"time": datetime.now()} json.dumps(data, default=custom_serializer) ``` #### 解析数字格式 ```python # 精确解析大数字(避免转为 float) json.loads('{"id": 12345678901234567890}', parse_int=str) ``` --- ### 注意事项 1. 只支持基本类型转换: - 字典 → JSON Object - 列表/元组 → JSON Array - `str`/`int`/`float`/`bool`/`None` → 对应 JSON 类型 2. 文件操作必须使用正确的模式: - 写入:`open(..., 'w')` - 读取:`open(..., 'r')` 3. 特殊字符会自动转义: ```python json.dumps({"text": "Line1\nLine2"}) # 输出 {"text": "Line1\\nLine2"} ``` --- ### 性能建议 | 场景 | 推荐方法 | |------|---------| | 处理大文件 | 使用 `json.load()`/`json.dump()` 流式处理 | | 高频小数据 | 使用 `json.loads()`/`json.dumps()` | | 需要类型扩展 | 继承 `json.JSONEncoder` 自定义编码器 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值