{"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