python的json模块的dumps,loads,dump,load方法介绍

python的json模块的dumps,loads,dump,load方法介绍
#Auther Bob
#--*--conding:utf-8 --*--

#jshon这个模块就是做序列化处理的,主要用到json模块的四种方法

#1、dumps
#2、loads
#3、dump
#4、load

#先介绍dumps方法
#通过jshon的dumps的模块可以把特定的对象序列化处理为字符串
# import json


# l1 = [1,2,3,454]
# d1 = {'k1':'v1'}
# ret = json.dumps(l1)
# print(type(ret))
# ret = json.dumps(d1)
# print(type(ret))


# <class 'str'>
# <class 'str'>


# l1 = '[1,2,3,4]'
# d1 = '{"k1":"v1"}'
# print(type(l1))
# print(type(d1))

#在来介绍loads方法
#上面的l1和d1都是字符串,但是他们的外形和list和dict一样,我们就可以通过反序列化把这2个字符串转换成list和dict,这里如果
#外形不是list或者dict的形状,则不会转换成功的
# ret = json.loads(l1)
# print(ret,type(ret))
# ret = json.loads(d1)
# print(ret,type(ret))


# [1, 2, 3, 4] <class 'list'>
# {'k1': 'v1'} <class 'dict'>




#来做一个小练习,通过第三方模块get到http请求,然后json模块把返回的字符串结构的数据转换字典的形式,这样我们就可以
#对这个字典做操作
# import requests
# import json
#
# ret = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=北京')
# ret.encoding = 'utf-8'
# s1 = ret.text
# print(s1,type(s1))

#拿到字符串形式的数据
# {"desc":"invilad-citykey","status":1002} <class 'str'>
#
# d1 = json.loads(s1)
# print(d1,type(d1))

#通过loads的方法,把字符串转换成字典
# {'desc': 'invilad-citykey', 'status': 1002} <class 'dict'>

#上面的dumps和loads方法都在内存中转换,下面的dump和load的方法会多一个步骤,dump是把序列化后的字符串写到一个文件中,而
#load是从一个一个文件中读取文件

#然后来介绍dump方法
# import json
# d1 = {'name':'foot'}
#这一步就会把d1做序列化处理后的字符串写到db这个文件中

# json.dump(d1,open('db','w'))
# d1 = json.load(open('db','r'))
# print(d1,type(d1))

# {'name': 'foot'} <class 'dict'>
pickle.dump(info,f) #f.write( pickle.dumps( info) )(两者区别)
<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、付费专栏及课程。

余额充值