比较两个json串是否相等

比较两个json是否相等,直接拿字符串相比较肯定是不行的,因为在json中无论数组还是kv映射,都不分先后的, 同一个json对象序列化后的字符串结果很可能也不一样。处理这个问题,按以下几步讨论。

利用python中的dict比较

在python中,dict的比较便是按key和value是否全相等来衡量的。所以将json加载成dict对象,就能非常容易地进行比较了。 如下代码直接从文件加载json:

d1 = json.load(open('file1'))
d2 = json.load(open('file2'))

递归搜索dict中的某个key

其实完成上面一步是不够的,因为在json中,数组的次序也不分先后的,而在python中,list和list进行比较,不仅要元素值一致, 而且出现的次序也要一致。这个时候就需要将所有数组元素进行排序,那么首先要解决的是能够递归遍历dict中的所有key和value。

好像python中没有递归遍历一个dict的方法,未来发现了,一定补在此文中。如下代码实现在dict中搜索指定key的value:

target_key = 'name'

def walk_find(k,v):
    if k == target_key:
        return v
    if isinstance(v, dict):
        for i,j in v.iteritems():
            res = walk_find(i,j)
            if res is not None:
                return res 
    if isinstance(v, (tuple, list)):
        for i in v:
            res = walk_find('', i)
            if res is not None:
                return res 
    return None

arr1 = walk_find('', d1)

将dict中的数组进行排序

好像是需要考虑数组排序时,里面元素的类型,数字、字符串、对象,该如何排序呀。好在python中我们不需要考虑这么多, 只需要简单的sort()一下就可以了,不同类型也能排序。所以,其实我们需要做的只是递归将所有数组类型的元素sort一下就好了,像下面这样:

def walk_sort(v):
    if isinstance(v, dict):
        for i,j in v.iteritems():
            walk_sort(j)
    if isinstance(v, (tuple, list)):
        v.sort()
        for i in v:
            walk_sort(i)

walk_sort(d)

因为是json转过来的对象,所以不存在循环引用的问题,不然上面的代码容易出现死循环,举个例子:

>>> s = [1,2,3]
>>> s.append(s)
>>> s
>>> [1, 2, 3, [...]]
发表于 2014年12月23日 20:47   评论:0   阅读:7566  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo