添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

python自带的json包能够方便的解析json文本,但是如果json文本中包含重复key的时候,解析的结果就是错误的。如下为例

  {"key":"1", "key":"2", "key":"3", "key2":"4"}

经过解析,结果却如下所示:

"key":"3", "key2":"4"

原因是python解析的时候是创建一个字典,首先会读取到key的值,但是后面遇到重复键的时候,后来的值会覆盖原来的值,导致最后只有一个key的值留下来。
这肯定不是我们想要的结果,其中一种结果可以是将相同键的值聚合成一个数组,即如下所示。

"key":["1","2","3"], "key2":"4"

如何得到这种结果呢?python的json包还是留下了活路的。首先来看一下解析函数loads的原型。

json.loads(s, encoding=None, cls=None, 
        object_hook=None, parse_float=None, 
        parse_int=None, parse_constant=None, 
        object_pairs_hook=None, **kw)

要注意的是object_pairs_hook这个参数,这是个回调函数,在解析json文本的时候会调用它并更改返回的结果。为了得到前述的结果,我们定义如下的hook函数:

def my_obj_pairs_hook(lst):
    result={}
    count={}
    for key,val in lst:
        if key in count:count[key]=1+count[key]
        else:count[key]=1
        if key in result:
            if count[key] > 2:
                result[key].append(val)
            else:
                result[key]=[result[key], val]
        else:
            result[key]=val
    return result

在解析文本的时候将上述函数作为参数传入,代码如下所示:

    json.loads(data, object_pairs_hook=my_obj_pairs_hook)

即可得到前述的相同键的值合并为数组的结果。
在这个示例中,传入my_obj_pairs_hook的参数是一个元组列表,大致如下所示:

[("key","1"),("key","2"),("key","3"),("key2","4")]

之所以参数是这个样子,是因为这几个键值对组成了一个字典,python使用默认的dict方法返回字典,自然会出现值覆盖的情况。而有了my_obj_pairs_hook之后就调用这个函数得到字典结果,这样我们就保证了键值的不丢失,最终得到我们希望的结果。如果是个更加复杂的json文本,则每次解析一个字典的时候都会调用这个函数,也会传入不同的元组列表,大致如示例所示。

python自带的json包能够方便的解析json文本,但是如果json文本中包含重复key的时候,解析的结果就是错误的。如下为例 {"key":"1", "key":"2", "key":"3", "key2":"4"} 经过解析,结果却如下所示: "key":"3", "key2":"4" 原因是python解析的时候是创建一个字典,首先会读取key的值,但是后面遇到重复键的时候,后来的值会覆盖原来的值,导致最后只有一个key的值留下来。 这肯定不是我们想要的结果,其中一种结果可以是将相同键的值聚合成一个数组,即如下所示。 "key":["1","2"," json里面的key默认是唯一,但是有些情况下json里面的key值并不唯一。比如我在分析WIFI协议的时候,如下图:这时候就需要解决key重复的问题。那么如何解决呢? 前言:由于自己post传输json的需要,需要自己往json串中添加数据没想到一个小小的json居然能那么让我头疼 如下(这里只截取部分数据,因为我的json串有点长): 我想往其中插入数据,结果百度半天,各种转格式,其种最坑的字典格式,大家都知道,字典key唯一,不能重复结果疯狂报错。 还发现了以下方法,能够定位到相应位置,但是由于是字典格式不能重复,放弃了 #以下便是哪个愚蠢的办法,并且只能... Python字典的键是不允许重复的,json字典的键可以重复,如果要用Python构建一个键重复json字符串该怎么处理好呢 我只想到了两个较简单的方法来达到这个目的 把有重复键值的部分先用一个特殊字符串标记,然后构造出有键重复json字符串,然后替换进去 import json json_data = {"params": "XXX"} params_str = '{"key": "... python自带的json包能够方便的解析json文本,但是如果json文本中包含重复key的时候,解析的结果就是错误的。如下为例{"key":"1", "key":"2", "key":"3", "key2":"4"}经过解析,结果却如下所示:{"key":"3","key2":"4"}原因是python解析的时候是创建一个字典,首先会读取key的值,但是后面遇到重复键的时候,后来的值会覆盖原... 最近在开发一个数据抓取业务模块,用于抓取本地数据库的部分关键数据, 作为数据分析和统计的依据. 在抓取过程中, 由于不同子业务项目产生的数据结构不是完全一样, 这时候就要用到判断数据节点是否存在的功能, 数据是json格式. 工作中遇到以下小问题,解决方法如下,可能比较暴力,暂时留档,再进行优化。 要求:将列表中json的 ‘id’ 字段值相同的数据,根据 type的值,按照一定的优先级次序排列,列表中仅保留优先级最高的type。 测试用例: list1 示例数据: type优先级列表:[6, 4, 2, 5, 8, 3, 7, 1] (依次递减,6优先级最高,1优先级最低) draw_data = [ {'geometry':{"coordinates":[121.87635833333333, 30.86