序列化为保留希伯来字符的 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的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 Json.NET 序列化为 json 字符串时缺少 DriveInfo 的属性?