序列化为保留希伯来字符的 JSON

Posted

技术标签:

【中文标题】序列化为保留希伯来字符的 JSON【英文标题】:serializing to JSON that would retain hebrew charcters 【发布时间】:2013-08-31 02:48:19 【问题描述】:

我有以下用例:

我从数据中生成了一个带有数据的 json,其中一部分是希伯来语单词。 例如:

import json
j = 
city =u'חיפה' #native unicode
j['results']= []
j['results'].append('city':city) #Also tried to city.encode('utf-8') and other encodings

为了生成一个 json 文件,它可以兼作我的应用程序数据库(微型地理应用程序)和我的用户可以直接编辑和修复数据的文件,我使用 json 库和:

to_save = json.dumps(j)
with open('test.json','wb') as f: #also tried with w instead of wb flag.
   f.write(to_save)
   f.close()

问题是我得到一个带有 u'חיפה' 的 unicode 解码 json,例如: 你'\u05d7\u05d9\u05e4\u05d4'

大多数脚本和应用程序在读取 Unicode 字符串时没有任何问题,但我的用户有一个!而且由于为开源项目做出贡献,他们需要直接编辑 JSON,他们无法弄清楚希伯来语文本。

所以,问题:我应该如何编写 json 而在另一个编辑器中打开它会显示希伯来字符?

我不确定这是否可以解决,因为我怀疑 JSON 一直是 unicode,我不能在其中使用 asccii,但不确定。

感谢您的帮助

【问题讨论】:

【参考方案1】:

使用ensure_ascii=False 参数。

>>> import json
>>> city = u'חיפה'
>>> print(json.dumps(city))
"\u05d7\u05d9\u05e4\u05d4"
>>> print(json.dumps(city, ensure_ascii=False))
"חיפה"

根据json.dump documentation:

如果 ensure_ascii 为 True(默认),则所有非 ASCII 字符在 输出使用 \uXXXX 序列进行转义,结果是 str 仅由 ASCII 字符组成的实例。如果 ensure_ascii 是 错误,一些写入 fp 的块可能是 unicode 实例。这 通常发生是因为输入包含 unicode 字符串或 使用编码参数。除非 fp.write() 明确理解 unicode(如在 codecs.getwriter() 中)这可能会导致错误。

您的代码应如下所示:

import json
j = 'results': [u'חיפה']
to_save = json.dumps(j, ensure_ascii=False)
with open('test.json', 'wb') as f:
    f.write(to_save.encode('utf-8'))

import codecs
import json
j = 'results': [u'חיפה']
to_save = json.dumps(j, ensure_ascii=False)
with codecs.open('test.json', 'wb', encoding='utf-8') as f:
    f.write(to_save)

import codecs
import json
j = 'results': [u'חיפה']
with codecs.open('test.json', 'wb', encoding='utf-8') as f:
    json.dump(j, f, ensure_ascii=False)

【讨论】:

请注意:根据JSON docs,值可以包含任何Unicode字符("\ 和控制字符除外)转义字符(如@ 987654331@)。所以json.dump 的两个版本都会生成有效的 JSON。 @falsetru 困扰我的是fp.write(),它让我在正确的json.dumps 配置(因为我已经尝试过你建议的配置)之后大吃一惊——codecs.write()小费对我来说是缺失的部分。请注意,您应该 codecs.open('file.json','wb',encoding='utf-8') 以使其正常工作。 @falsetru 注意你现在不需要to_save 行,你的版本更优雅 @alonisser,你是对的。最后一个版本不需要to_save。我编辑了那个。

以上是关于序列化为保留希伯来字符的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

将 Python namedtuple 序列化为 json

为啥使用 Json.NET 序列化为 json 字符串时缺少 DriveInfo 的属性?

将 JSON 字符串反序列化为多个 C# 对象

JSON将Scala案例类序列化为仅字符串和整数

如何覆盖属性的 JSON 序列化,将值序列化为字符串而不是对象?

Java GSON - 将int序列化为json文件的字符串