示例代码:

>>> import json
>>> json_string = json.dumps("ברי צקלה")
>>> print(json_string)
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"

问题是:它不是人类可读的.我的(智能)用户希望验证甚至编辑带有JSON转储的文本文件(我不想使用XML).

有没有办法将对象序列化为UTF-8JSON字符串(而不是\uXXXX)?

推荐答案

ensure_ascii=Falseswitch 设为json.dumps(),然后手动将该值编码为UTF-8:

>>> json_string = json.dumps("ברי צקלה", ensure_ascii=False).encode('utf8')
>>> json_string
b'"\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94"'
>>> print(json_string.decode())
"ברי צקלה"

如果要写入文件,只需使用json.dump()并将其留给file对象进行编码:

with open('filename', 'w', encoding='utf8') as json_file:
    json.dump("ברי צקלה", json_file, ensure_ascii=False)

Caveats for Python 2

对于Python2,还有一些需要考虑的注意事项.如果要将其写入文件,可以使用io.open()而不是open()生成一个文件对象,在写入时为您编码Unicode值,然后使用json.dump()而不是写入该文件:

with io.open('filename', 'w', encoding='utf8') as json_file:
    json.dump(u"ברי צקלה", json_file, ensure_ascii=False)

请注意,有一个bug in the json module,其中ensure_ascii=False标志可以生成unicodestr个对象中的mix个.Python 2的解决方案是:

with io.open('filename', 'w', encoding='utf8') as json_file:
    data = json.dumps(u"ברי צקלה", ensure_ascii=False)
    # unicode(data) auto-decodes data to unicode if str
    json_file.write(unicode(data))

在Python 2中,当使用编码为UTF-8的字节字符串(类型str)时,请确保还设置encoding关键字:

>>> d={ 1: "ברי צקלה", 2: u"ברי צקלה" }
>>> d
{1: '\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94', 2: u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'}

>>> s=json.dumps(d, ensure_ascii=False, encoding='utf8')
>>> s
u'{"1": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4", "2": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"}'
>>> json.loads(s)['1']
u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
>>> json.loads(s)['2']
u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
>>> print json.loads(s)['1']
ברי צקלה
>>> print json.loads(s)['2']
ברי צקלה

Python相关问答推荐

NumPy中的右矩阵划分,还有比NP.linalg.inv()更好的方法吗?

将轨迹优化问题描述为NLP.如何用Gekko解决这个问题?当前面临异常:@错误:最大方程长度错误

Python -根据另一个数据框中的列编辑和替换数据框中的列值

如何在BeautifulSoup中链接Find()方法并处理无?

在Python中管理打开对话框

递归访问嵌套字典中的元素值

Django RawSQL注释字段

CommandeError:模块numba没有属性generated_jit''''

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

在Python中使用yaml渲染(多行字符串)

基于Scipy插值法的三次样条系数

Odoo16:模板中使用的docs变量在哪里定义?

如何在Python请求中组合多个适配器?

使用tqdm的进度条

如何在一组行中找到循环?

应用指定的规则构建数组

你能把函数的返回类型用作其他地方的类型吗?'

如何为需要初始化的具体类实现依赖反转和接口分离?

将数字数组添加到Pandas DataFrame的单元格依赖于初始化

以极轴表示的行数表达式?