我正在使用 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`
很久以前 ,当我坚持使用 Python 2 时就问 了 这个问题。今天一种简单易用的解决方案是使用最新版本的Python,即
Python 3 及更高版本。
object_hook
import json
def json_load_byteified(file_handle):
return _byteify(
json.load(file_handle, object_hook=_byteify),
ignore_dicts=True
)
def json_loads_byteified(json_text):
return _byteify(
json.loads(json_text, object_hook=_byteify),
ignore_dicts=True
)
def _byteify(data, ignore_dicts = False):
# if this is a unicode string, return its string representation
if isinstance(data, unicode):
return data.encode('utf-8')
# if this is a list of values, return list of byteified values
if isinstance(data, list):
return [ _byteify(item, ignore_dicts=True) for item in data ]
# if this is a dictionary, return dictionary of byteified keys and values
# but only if we haven't already byteified it
if isinstance(data, dict) and not ignore_dicts:
return {
_byteify(key, ignore_dicts=True): _byteify(value, ignore_dicts=True)
for key, value in data.iteritems()
}
# if it's anything else, return it in its original form
return data
用法示例:
>>> **_json_loads_byteified('{"Hello": "World"}')_**
{'Hello': 'World'}
>>> **_json_loads_byteified('"I am a top-level string"')_**
'I am a top-level string'
>>> **_json_loads_byteified('7')_**
7
>>> **_json_loads_byteified('["I am inside a list"]')_**
['I am inside a list']
>>> **_json_loads_byteified('[[[[[[[["I am inside a big nest of lists"]]]]]]]]')_**
[[[[[[[['I am inside a big nest of lists']]]]]]]]
>>> **_json_loads_byteified('{"foo": "bar", "things": [7, {"qux": "baz", "moo": {"cow": ["milk"]}}]}')_**
{'things': [7, {'qux': 'baz', 'moo': {'cow': ['milk']}}], 'foo': 'bar'}
>>> **_json_load_byteified(open('somefile.json'))_**
{'more json': 'from a file'}
MarkAmery的功能比这些功能更短,更清晰,那么它们的意义何在?您为什么要使用它们?
纯粹是为了 表现
。Mark的答案首先使用unicode字符串完全解码JSON文本,然后遍历整个解码值以将所有字符串转换为字节字符串。这有一些不良影响:
这个答案通过缓解这两方面的性能问题object_hook
的参数json.load
和json.loads
。从文档:
object_hook
是一个可选函数,它将被解码的任何对象文字(a
dict
)的结果调用。将使用object_hook的返回值代替dict
。此功能可用于实现自定义解码器
由于在其他字典中嵌套了许多级别的字典object_hook
在解码时 会传递给 它们
,因此我们可以在那时将其中的任何字符串或列表字节化,并避免以后再进行深度递归。
Mark的答案不适合按object_hook
现状使用,因为它会递归为嵌套词典。我们阻止这个答案与该递归ignore_dicts
参数_byteify
,它被传递给它在任何时候都
只是
当object_hook
它传递一个新dict
来byteify。该ignore_dicts
标志指示_byteify
忽略dict
s,因为它们已经被字节化了。
最后,我们的实现json_load_byteified
和在从或返回的结果上json_loads_byteified
调用_byteify
(with
ignore_dicts=True
)来处理被解码的JSON文本在顶层没有的情况。json.load``json.loads``dict
问题内容: 我正在使用Python 2从ASCII编码的文本文件中解析JSON 。 用json或 加载这些文件时simplejson,我所有的字符串值都转换为Unicode对象而不是字符串对象。问题是,我必须将数据与仅接受字符串对象的某些库一起使用。我无法更改库,也无法更新它们。 是否可以获取字符串对象而不是Unicode对象? 例 问题答案: 解决方案 用法示例: 它是如何工作的,为什么要使用它
我有一个方法,它应该从JSON返回不同的对象,这取决于参数中的类类型。我试着根据参数返回一个对象列表,但是我只把LinkedHashMap放入ArrayList。 我搜索了很多,但是在解决方案中,类类型的所有地方都是硬编码的。 有没有一种不用硬代码就能解决这个问题的方法? 我只想传递类类型并通过一个方法获取对象。 当我的对象有关系时,我得到这个例外 无法识别的字段"字段"(类model.orm.部
我在MySQL5.7中有TEST(id,INT,attributejson)表 当我尝试使用mysql包在Nodejs中查询表时,如下所示 null 有没有一种方法可以将上述结果中的包项作为JSON对象而不是字符串来获取,而不需要迭代数组并执行JSON.parse来将字符串转换为JSON? 预期产出
问题内容: 我得到的输出为 控制器中的日期Mon Dec 31 IST 2012 请提出一种以格式输出日期的方法。需要以日期格式而不是字符串形式输出,以便将输出存储在mysql db的字段中 问题答案: 声明后 您有一个对象, 可以将其按原样存储在mysql DB中 (列类型:datetime)。 但是,在打印时,它默认为实现。我认为您希望获得类似Date @的输出,但是toString以用户可读
我正在做一个项目,在那里用户可以写其他用户的邮件。邮件类当前如下所示: 现在,问题是,我需要将所有邮件保存到. yml用户数据文件中。对我来说,最简单的方法是首先将每封邮件转换为字符串,然后将所有邮件保存到
问题内容: 从表单获取变量: 如果我输入1并使用gettype($ POST _ [‘a’]),它将返回字符串,可以输入int吗?因为在此之后,我要检查该变量是否为int。 更新 得到的答案是,它总是返回字符串,他们为我提供了使用(int)或intval()的方法,但是如果它真的像’a’这样的字符串,它会返回0,但它也可能是整数值0,如何克服这个问题? 更新 编辑错字后,Brad Christie