📜  Python-json 7:Unicode和非ASCII字符编码为JSON

📅  最后修改于: 2020-09-01 07:52:07             🧑  作者: Mango

在之前的的文章中,我们学习了json的数据结构、编码解码等。

在实际的运用过程中,我们还经常会遇到数据编码的问题,所以我们利用本章节做一些介绍。

  • 如何将Unicode或非ASCII数据序列化为JSON字符串
  • utf-8格式编码Unicode数据
  • 如何序列化转义的所有传入非ASCII字符

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转义序列。

将非ASCII或Unicode数据原样保存为JSON中的\u转义序列

尝试将Unicode数据编码为JSON。当您要将Unicode字符转储为字符而不是转义序列时,此解决方案很有用。

设置ensure_ascii=Falsejson.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': 'ø'}

JSON序列化Unicode数据并将其写入文件

上面的示例中,我们看到了如何将非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"])

输出保存的如下所示:

将Unicode对象序列化为UTF-8 JSON字符串

可以将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': 'ø'}

将Unicode和ASCII(混合数据)都编码为JSON

我们尝试如何将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}