强制Python json模块使用ASCII

gar*_*h0p 16 python unicode json ascii

我正在使用json.dump()和json.load()来保存/读取磁盘的字符串字典.问题是我不能在unicode中使用任何字符串.无论我如何将参数设置为dump/load(包括ensure_ascii和encoding),它们似乎都是unicode.

And*_*ark 24

如果您只是处理简单的JSON对象,则可以使用以下命令:

def ascii_encode_dict(data):
    ascii_encode = lambda x: x.encode('ascii')
    return dict(map(ascii_encode, pair) for pair in data.items())

json.loads(json_data, object_hook=ascii_encode_dict)
Run Code Online (Sandbox Code Playgroud)

以下是它的工作原理示例:

>>> json_data = '{"foo": "bar", "bar": "baz"}'
>>> json.loads(json_data)                                # old call gives unicode
{u'foo': u'bar', u'bar': u'baz'}
>>> json.loads(json_data, object_hook=ascii_encode_dict) # new call gives str
{'foo': 'bar', 'bar': 'baz'}
Run Code Online (Sandbox Code Playgroud)

这个答案适用于更复杂的JSON结构,并对object_hook参数提供了一些很好的解释.还有另一个答案,递归地获取json.loads()调用的结果并将所有Unicode字符串转换为字节字符串.

  • 如果数据有多个"ord> 128"的字符,您可能希望将行更改为"ascii_encode = lambda x:x.encode('ascii','ignore'). (2认同)

tor*_*ord 14

如果json对象是数据类型的混合,而不仅仅是unicode字符串,您可以使用以下表达式:

def ascii_encode_dict(data):
    ascii_encode = lambda x: x.encode('ascii') if isinstance(x, unicode) else x 
    return dict(map(ascii_encode, pair) for pair in data.items())
Run Code Online (Sandbox Code Playgroud)