在对文件内容或字符串进行JSON反序列化(deserialize)时,由于原始内容编码问题,可能需要对反序列化后的内容进行编码处理(如将unicode对象转换为str)。
在Python中,一种方式是先使用json.load或json.loads反序列化得到dict对象,然后对这个dict对象进行编码处理。
但其实在json.load与json.loads中,有可选参数object_hook。通过使用此参数,可以对反序列化得到的dict直接进行处理,并使用处理后新的dict替代原dict返回。
使用方法为:
d = json.loads(json_str,object_hook=_decode_dict)
附Shadowsocks中使用的_decode_dict与_decode_list:
def _decode_list(data):
rv = []
for item in data:
if isinstance(item,unicode):
item = item.encode('utf-8')
elif isinstance(item,list):
item = _decode_list(item)
elif isinstance(item,dict):
item = _decode_dict(item)
rv.append(item)
return rv
def _decode_dict(data):
rv = {}
for key,value in data.iteritems():
if isinstance(key,unicode):
key = key.encode('utf-8')
if isinstance(value,unicode):
value = value.encode('utf-8')
elif isinstance(value,list):
value = _decode_list(value)
elif isinstance(value,dict):
value = _decode_dict(value)
rv[key] = value
return rv
参考:
1.https://docs.python.org/2/library/json.html
2.https://github.com/clowwindy/shadowsocks/blob/master/shadowsocks/utils.py
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。