python3json存储时防止中文转义

本文介绍如何使用Python的json模块来避免ASCII转义问题,通过设置ensure_ascii参数为False,可以实现在导出JSON数据时不进行转义,方便阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

data = {
    'title':title,
    'prices':prices,
    'kilometre':kilometre,
    'discharge':discharge,
    'purpose':purpose,
    'card_time':card_time,
    'color':color,
    'contacts':contacts,
    'address':address,
    'm_title':m_title,
    'photo':photo,
    'picture':picture
}
with open('./hx/data.json', 'w',encoding='utf-8') as f:
    f.write(json.dumps(data,ensure_ascii=False))

下图是没有转义

 

下图是转义后的文件:

 

想要不转义就给json.dumps添加参数。

,ensure_ascii=False
### Python 中 `json.dumps` 的自定义序列化处理 在 Python 3 中,`json.dumps()` 方法用于将 Python 数据结构(如字典、列表等)转换为 JSON 字符串。然而,默认情况下它无法直接序列化某些特殊类型的对象,比如 `bytes` 类型的数据。如果尝试这样做,则会抛出错误:`TypeError: Object of type bytes is not JSON serializable`[^4]。 为了实现对 `bytes` 对象的自定义序列化并跳过默认行为,可以利用 `json.dumps()` 提供的一个参数——`default` 参数。该参数允许我们指定一个函数来处理那些不可被标准方法序列化的对象。 以下是具体实现方式: #### 使用 `default` 参数进行自定义序列化 通过设置 `default` 参数,我们可以编写逻辑,在遇到特定类型(例如 `bytes`)将其转化为可序列化的格式。通常的做法是将 `bytes` 转换为其十六进制表示或者 Base64 编码后的字符串形式。 ```python import json import base64 def custom_serializer(obj): if isinstance(obj, bytes): # 如果检测到 obj 是 bytes 类型 return {'__class__': 'bytes', '__value__': base64.b64encode(obj).decode('utf-8')} # 返回编码后的字符串 raise TypeError(f'Object of type {obj.__class__.__name__} is not JSON serializable') data = { "key1": b"value_in_bytes", "key2": "normal_string" } serialized_data = json.dumps(data, default=custom_serializer) print(serialized_data) deserialized_data = json.loads(serialized_data) def custom_deserializer(dct): if dct.get('__class__') == 'bytes': return base64.b64decode(dct['__value__'].encode('utf-8')) return dct final_data = json.loads(serialized_data, object_hook=custom_deserializer) print(final_data["key1"]) ``` 上述代码展示了如何使用 `default` 参数来自定义序列化过程,并且还包含了反序列化的部分。对于 `bytes` 类型的对象,先用 Base64 进行编码再存入 JSON;而在读取 JSON 则需提供相应的解码机制以恢复原始数据。 #### 关键点说明 - **Base64 编码**:由于 JSON 不支持直接存储二进制数据,因此常用的方法之一就是采用 Base64 来转义这些数据。 - **异常捕获**:当传给 `default` 函数的对象既不是 `bytes` 类型也无法被正常序列化,应显式抛出异常以便定位问题所在。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩淼燃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值