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)
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)
相关文章推荐
- python 使用 simplejson 将字符串转换成字典dict
- python json字符串与字典对象相互转换
- Python解析非标准JSON(Key值非字符串)
- python解析json字符串
- Python处理json字符串转化为字典
- Python处理json字符串转化为字典的简单实现
- Python处理json字符串转化为字典
- Python 字符串,字典,数据库,列表和json互相转化
- Python 字符串转JSON; 先装字典在转JSON; json.dumps(d)
- python解析json字符串和json文件的区别
- python中将字典转换成其json字符串
- python中将字典转换成其json字符串
- Python处理json字符串转化为字典
- Python3基础 解析json格式的数据,得到一个字典 json.loads()
- Python中解析json字符串
- Python - json字符串的解析
- python解析json字符串
- Python2基础用法(字符串,list,元组,字典解析)
- python-json字符串至字典
- 使用python解析Json字符串-获取Json字符串关键字