📅  最后修改于: 2020-09-01 07:52:07             🧑  作者: Mango
在之前的的文章中,我们学习了json的数据结构、编码解码等。
在实际的运用过程中,我们还经常会遇到数据编码的问题,所以我们利用本章节做一些介绍。
utf-8
格式编码Unicode数据Python RFC 7159 需要UTF-8,UTF-16,或UTF-32来表示json数据,UTF-8是默认的方法。
sure_ascii参数
使用json.jump/json.jumps方法将Python对象编码为JSON, 有一个ensure_ascii
参数, 如果 ensure_ascii=True
则输出保证所有非ASCII字符转义是默认的编码;如果为ensure_ascii=False
,这些字符将原样输出。
使用ensure_ascii=True,我们可以提供一种表示Unicode字符的安全方法。通过将其设置为true,我们确保结果JSON是有效的ASCII字符(即使它们内部包含Unicode)。
使用ensure_ascii=False,我们确保生成的JSON字符按原样存储Unicode字符,而不是\u转义序列。
尝试将Unicode数据编码为JSON。当您要将Unicode字符转储为字符而不是转义序列时,此解决方案很有用。
设置ensure_ascii=False
为json.dumps()
将Unicode原样编码为JSON
import json
unicodeData= {
"string1": "明彦",
"string2": u"\u00f8"
}
print("unicode Data is ", unicodeData)
encodedUnicode = json.dumps(unicodeData, ensure_ascii=False) # use dump() method to write it in file
print("JSON character encoding by setting ensure_ascii=False", encodedUnicode)
print("Decoding JSON", json.loads(encodedUnicode))
输出如下所示: (将Unicode字符串按原样存储在JSON中)
unicode Data is {'string1': '明彦', 'string2': 'ø'}
JSON character encoding by setting ensure_ascii=False {"string1": "明彦", "string2": "ø"}
Decoding JSON {'string1': '明彦', 'string2': 'ø'}
上面的示例中,我们看到了如何将非ASCII或Unicode数据另存为JSON中的\ u转义序列。现在,让我们看看如何将JSON序列化的Unicode数据原样写入文件。
import json
sampleDict= {
"string1": "明彦",
"string2": u"\u00f8"
}
with open("unicodeFile.json", "w", encoding='utf-8') as write_file:
json.dump(sampleDict, write_file, ensure_ascii=False)
print("Done writing JSON serialized Unicode Data as-is into file")
with open("unicodeFile.json", "r", encoding='utf-8') as read_file:
print("Reading JSON serialized Unicode data from file")
sampleData = json.load(read_file)
print("Decoded JSON serialized Unicode data")
print(sampleData["string1"], sampleData["string1"])
输出保存的如下所示:
可以将JSON编码设置为UTF-8。建议使用UTF-8,以实现最大的互操作性。设置ensure_ascii=False
为,并使用“ UTF-8 “将Unicode数据编码为JSON 。
import json
# encoding in UTF-8
unicodeData= {
"string1": "明彦",
"string2": u"\u00f8"
}
print("unicode Data is ", unicodeData)
print("Unicode JSON Data encoding using utf-8")
encodedUnicode = json.dumps(unicodeData, ensure_ascii=False).encode('utf-8')
print("JSON character encoding by setting ensure_ascii=False", encodedUnicode)
print("Decoding JSON", json.loads(encodedUnicode))
输出如下:
unicode Data is {'string1': '明彦', 'string2': 'ø'}
Unicode JSON Data encoding using utf-8
JSON character encoding by setting ensure_ascii=False b'{"string1": "\xe6\x98\x8e\xe5\xbd\xa6", "string2": "\xc3\xb8"}'
Decoding JSON {'string1': '明彦', 'string2': 'ø'}
我们尝试如何将Python字典编码为同时包含Unicode和ASCII数据的JSON
import json
sampleDict = {"name": "明彦", "age": 25}
print("unicode Data is ", sampleDict)
# set ensure_ascii=True
jsonDict = json.dumps(sampleDict, ensure_ascii=True)
print("JSON character encoding by setting ensure_ascii=True")
print(jsonDict)
print("Decoding JSON", json.loads(jsonDict))
# set ensure_ascii=False
jsonDict = json.dumps(sampleDict, ensure_ascii=False)
print("JSON character encoding by setting ensure_ascii=False")
print(jsonDict)
print("Decoding JSON", json.loads(jsonDict))
# set ensure_ascii=False and encode using utf-8
jsonDict = json.dumps(sampleDict, ensure_ascii=False).encode('utf-8')
print("JSON character encoding by setting ensure_ascii=False and UTF-8")
print(jsonDict)
print("Decoding JSON", json.loads(jsonDict))
输出信息:
unicode Data is {'name': '明彦', 'age': 25}
JSON character encoding by setting ensure_ascii=True
{"name": "\u660e\u5f66", "age": 25}
Decoding JSON {'name': '明彦', 'age': 25}
JSON character encoding by setting ensure_ascii=False
{"name": "明彦", "age": 25}
Decoding JSON {'name': '明彦', 'age': 25}
JSON character encoding by setting ensure_ascii=False and UTF-8
b'{"name": "\xe6\x98\x8e\xe5\xbd\xa6", "age": 25}'
Decoding JSON {'name': '明彦', 'age': 25}