我正在使用 Python 2 从 ASCII 编码 的文本文件中解析 JSON。
当使用 json
或 simplejson
加载这些文件时,我所有的字符串值都被转换为 Unicode 对象而不是字符串对象。问题是,我必须将数据与一些只接受字符串对象的库一起使用。我 无法更改库 或更新它们。
是否可以获取字符串对象而不是 Unicode 对象?
例子
>>> import json
>>> original_list = ['a', 'b']
>>> json_list = json.dumps(original_list)
>>> json_list
'["a", "b"]'
>>> new_list = json.loads(json_list)
>>> new_list
[u'a', u'b'] # I want these to be of type `str`, not `unicode`
(2017 年一个简单干净的解决方案是使用最新版本的 Python——即 Python 3 及更高版本。)
原文由 Brutus 发布,翻译遵循 CC BY-SA 4.0 许可协议
解决方案
object_hook
它适用于 Python 2.7 和 3.x。
用法示例:
这是如何工作的,我为什么要使用它?
Mark Amery 的函数 比这些函数更短、更清晰,那么它们有什么意义呢?你为什么要使用它们?
纯粹为了 性能。 Mark 的回答首先使用 Unicode 字符串完全解码 JSON 文本,然后递归遍历整个解码值以将所有字符串转换为字节字符串。这会产生一些不良影响:
该答案通过使用
object_hook
参数json.load
和json.loads
来缓解这两个性能问题。从 文档中:由于在其他词典中嵌套了很多层的词典 在解码 时会传递给
object_hook
,我们可以在此时对其中的任何字符串或列表进行字节化,避免以后进行深度递归。马克的回答不适合用作
object_hook
就目前而言,因为它递归到嵌套字典中。我们使用ignore_dicts
参数来防止此答案中的递归_byteify
,它始终传递给它, 除非object_hook
dict
字节化。ignore_dicts
标志告诉_byteify
忽略dict
s 因为它们已经被字节化了。Finally, our implementations of
json_load_byteified
andjson_loads_byteified
call_byteify
(withignore_dicts=True
) on the result returned fromjson.load
或json.loads
处理被解码的 JSON 文本在顶层没有dict
的情况。