python 之 json中文读写乱码问题
标签: python 之 json中文读写乱码问题 博客 51CTO博客
2023-07-23 18:24:17 199浏览
问题出现场景
一、读取json文件时(打印或者显示)
假设有个json文件,把文件内的内容print出来
{
"cities": [
{
"city": "北京",
"cityid": "101010100"
},
{
"city": "上海",
"cityid": "101020100"
}
]
}
首先这么写:
def readJson():
josnFile = open('someJson.json', 'rb')
file = json.load(josnFile)
data = json.dumps(file, indent=4)
return data
print(readJson())
输出的内容如下:
{
"cities": [
{
"city": "\u5317\u4eac",
"cityid": "101010100"
},
{
"city": "\u4e0a\u6d77",
"cityid": "101020100"
}
]
}
中文变成了Unicode编码了,由于dumps方法不会去修改json文件本身,我们给dumps加个参数看看 ensure_ascii=False
data = json.dumps(file, indent=4, ensure_ascii=False)
输出正确的格式了:
在上面的示例中,我们首先使用`json.load()`函数读取JSON文件中的数据,并对其进行修改。然后,我们使用`json.dump()`函数将修改后的数据保存回JSON文件中,并在保存时指定`ensure_ascii=False`参数以保留非ASCII字符的原始形式。
为什么呢?
这是因为json.dumps 序列化时对中文默认使用的ascii编码,想输出真正的中文需要指定ensure_ascii=False
二、修改json文件时
如果我想修改上面json文件中 北京的cityid,我会这么写:
def writeJson():
with open('someJson.json', 'r') as file:
data = json.load(file)
# 修改 JSON 数据
# 遍历 cities 列表
for city in data['cities']:
if city['city'] == '北京':
# 修改 cityid
city['cityid'] = '12345678'
# 写入修改后的 JSON 数据到文件
with open('someJson.json', 'w') as file:
json.dump(data, file, indent=4)
结果是这样的,我的json又变成乱码了,而且,北京的cityid也没有修改成功:
{
"cities": [
{
"city": "\u9356\u693e\u542b",
"cityid": "101010100"
},
{
"city": "\u6d93\u5a43\u6363",
"cityid": "101020100"
}
]
}
跟第一个场景一样,加个参数试试:json.dump(data, file, indent=4, ensure_ascii=False),结果乱码消失了,但是cityid还是没有修改成功。。。。
通过断点调试发现:
city不知道为什么又变成了乱码,也就是我们解析的时候不能匹配到“北京”的cityid,自然就改不到cityid的值了
为什么是乱码,不是unicode编码呢?
可能是由于文件的编码方式不正确导致的。在保存文件时,可以指定正确的编码方式来解决这个问题:
def writeJson():
with open('someJson.json', 'r', encoding='utf-8') as file:
data = json.load(file)
# 修改 JSON 数据
# 遍历 cities 列表
for city in data['cities']:
if city['city'] == '北京':
# 修改 cityid
city['cityid'] = '12345678'
# 写入修改后的 JSON 数据到文件
with open('someJson.json', 'w', encoding='utf-8') as file:
json.dump(data, file, indent=4, ensure_ascii=False)
在读取JSON文件时使用encoding='utf-8'
参数来指定文件的编码方式为UTF-8(不一定是utf-8编码,可能是gbk等 可以用文本编辑器查看文件编码)。然后,在保存JSON文件时也使用相同的编码方式。通过保持读取和保存文件时的编码方式一致,可以避免出现乱码的问题、最终修改成功:
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论
您可能感兴趣的博客