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

在某些设计不合理的的加密方式下,生成的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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值