您的位置:首页 > 编程语言 > Python开发

python2.6对json字符串有序的解析成有序的字典

2017-09-26 10:38 776 查看
在某些设计不合理的的加密方式下,生成的json字符串,解析成对象的时候,序保证字典key的先后顺序。

Python2.6不支持,采取的办法是:

1. 把Python2.7的json目录复制到工程目录,取名叫jsonx

2. 修改几处import使无语法错误

3. 参考它的encoder,实现如下代码:

import jsonx
from jsonx.encoder import encode_basestring
from collections import OrderedDict

def dumps( orderDict, encoding="utf8" ):
"""
不支持ensure_ascii=False
对有序字典有序序列化(不支持null None NaN true/false True/False等js数据类型)
:param orderDict:
:param encoding:
:return:
"""

def _iter_list( vlst ):
if not vlst:
yield '[]'
return

buf = "["
first = True
for e in vlst:
if first:
first = False
else:
buf = ','

if isinstance(e, OrderedDict):
yield buf
cs = _iter_dict(e)
for c in cs:
yield c

elif isinstance(e, (list, tuple)):
yield buf
cs = _iter_list(e)
for c in cs:
yield c

else:
if isinstance(e, unicode):
yield buf + encode_basestring(e.encode(encoding))
elif isinstance(e, basestring):
yield buf + encode_basestring(e)
elif isinstance(e, (int, long)):
yield buf + str(e)
elif isinstance(e, float):
yield buf + repr(e)
else:
yield buf + str(e)
yield ']'

def _iter_dict( od ):
if not od:
yield '{}'
return

yield '{'
first = True
for k, v in od.items( ):
if isinstance(k, unicode):
key = encode_basestring(k.encode(encoding))
elif isinstance(k, basestring):
key = encode_basestring(k)
elif isinstance(k, (int, long)):
key = str(k)
elif isinstance(k, float):
key = repr(k)
else:
key = '"' + str(k) + '"' # TypeError

if first:
first = False
else:
yield ","

yield key
yield ":"

if isinstance(v, unicode):
yield encode_basestring(v.encode(encoding))
elif isinstance(v, basestring):
yield encode_basestring(v)
elif isinstance(v, (int, long)):
yield str(v)
elif isinstance(v, float):
yield repr(v)
else:
if isinstance(v, OrderedDict):
chunks = _iter_dict(v)
for c in chunks:
yield c
elif isinstance(v, list):
chunks = _iter_list(v)
for c in chunks:
yield c
else:
yield '"' + str(v) + '"'
yield "}"

if isinstance(orderDict, list):
it = _iter_list(orderDict)
elif isinstance(orderDict, OrderedDict):
it = _iter_dict(orderDict)
else:
raise TypeError(orderDict)

return ''.join(it)

def loads( s, encoding="utf8" ):
return jsonx.loads(s, encoding=encoding, object_pairs_hook=OrderedDict)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: