{"key":"1", "key":"2", "key":"3", "key2":"4"}
把上面的值写入到json文件中。
如果不处理重复key的问题,输出结果会怎么样?
代码如下:
import json
json_list={"key": "1", "key": "2", "key": "3", "key2": "4"}
with open("4.json",'r',encoding='utf8') as fp:
json_data = json.load(fp)
print(json_data)
输出结果:
重复的key,程序默认只保留了最后一个值,这样显然不符合我们的需求。我们希望的结果是:
"key":["1","2","3"],
"key2":"4"
所以该怎么解决呢?
首先来看一下解析函数load函数,如下:
def load(fp, *, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
"""Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
a JSON document) to a Python object.
``object_hook`` is an optional function that will be called with the
result of any object literal decode (a ``dict``). The return value of
``object_hook`` will be used instead of the ``dict``. This feature
can be used to implement custom decoders (e.g. JSON-RPC class hinting).
``object_pairs_hook`` is an optional function that will be called with the
result of any object literal decoded with an ordered list of pairs. The
return value of ``object_pairs_hook`` will be used instead of the ``dict``.
This feature can be used to implement custom decoders. If ``object_hook``
is also defined, the ``object_pairs_hook`` takes priority.
object_hook
是一个可选函数,将使用任何对象文字解码(dict
)的结果调用。
object_hook
的返回值将被用来代替dict
。 此功能可用于实现自定义解码器(例如 JSON-RPC 类提示)。
object_pairs_hook
是一个可选函数,将使用任何对象字面量的结果以有序的对列表解码的结果调用。
object_pairs_hook
的返回值将被用来代替dict
。 此功能可用于实现自定义解码器。 如果还定义了“object_hook”,则“object_pairs_hook”优先。
object_pairs_hook是个回调函数,在解析json文本的时候会调用它并更改返回的结果。为了得到前述的结果,我们定义如下的hook函数:
def 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
然后在执行load的时候加上这个函数。代码如下:
import json
def 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
with open("4.json",'r',encoding='utf8') as fp:
json_data = json.load(fp,object_pairs_hook=obj_pairs_hook)
print(json_data)
输出结果:
参考文章:
https://blog.csdn.net/dahlwuyn/article/details/52293544
python自带的json包能够方便的解析json文本,但是如果json文本中包含重复key的时候,解析的结果就是错误的。如下为例
{"key":"1", "key":"2", "key":"3", "key2":"4"}
经过解析,结果却如下所示:
"key":"3",
"key2":"4"
原因是python解析的时候是创建一个字典,首先会读取到key的值,但是后面遇到重复键的时候,后来的值会覆盖原来的值,导致最后只有一个key的值留下来。
这肯定不是我们想要的结果,其中一种结果可以是将相同键的值聚合成一个数组,即如下所示。
"key":["1","2","
json与dict的区别
Python 的dict是一种数据结构,json 是一种数据传输格式。json 就是一个根据某种约定格式编写的纯字符串,不具备任何数据结构的特征。而 python 的dict的字符串表现形式的规则看上去和 json 类似,但是dict本身是一个完整的数据结构,实现了一切自身该有的算法。
Python的dict的key可以是任意可hash对象,json只能是字符串。形式上有些相像,但json是纯文本的,无法直接操作。
json的格式要求必须且只能使用双引号作为key或者值的边界符号
工作中遇到以下小问题,解决方法如下,可能比较暴力,暂时留档,再进行优化。
要求:将列表中json的 ‘id’ 字段值相同的数据,根据 type的值,按照一定的优先级次序排列,列表中仅保留优先级最高的type。
测试用例:
list1 示例数据:
type优先级列表:[6, 4, 2, 5, 8, 3, 7, 1] (依次递减,6优先级最高,1优先级最低)
draw_data = [
{'geometry':{"coordinates":[121.87635833333333, 30.86
print(obj["name"]) # 输出:John
print(obj["age"]) # 输出:30
print(obj["city"]) # 输出:New York
如果JSON数据很大,可以使用`json.load()`函数从文件中加载JSON数据。例如:
```python
import json
# 从文件中加载JSON数据
with open('data.json', 'r') as f:
data = json.load(f)
# 根据 key 值获取对应的 value
print(data["name"])
其中,`data.json`是包含JSON数据的文件名。