python 比较json/dictionary的库

简介: python 比较json/dictionary的库

在某些情况下,比较两个json/dictionary,或许这样就可以实现:

>>> a
{'a': 1, 'b': 2}
>>> b
{'a': 2, 'c': 2}
>>> cmp(a,b)        #-1或者1,代表两个dict不一样
-1
>>> c=a.copy()
>>> c
{'a': 1, 'b': 2}
>>> cmp(a,c)       #两者相同
0

但是,这只能比较两个是不是一样,不能深入各处哪里不一样的比较结果。

有这样一个库,就能解决这个问题,它就是json_tools

安装

方法1:

>>> pip install json_tools

或者

>>> easy_install json_tools

方法2:到这里下载源码:https://pypi.python.org/pypi/json_tools,然后进行安装

比较json

首先看看都有哪些属性或者方法,用万能的实验室来看:

>>> import json_tools
>>> dir(json_tools)

['builtins', 'doc', 'file', 'loader', 'name', 'package', 'path', '_patch_main', '_printer_main', 'diff', 'patch', 'path', 'print_function', 'print_json', 'print_style', 'printer']

从上面的结果中,可以看到json_tools的各种属性和方法。

我在一个项目中使用了diff,下面演示一下使用过程

>>> a
{'a': 1, 'b': 2}
>>> b
{'a': 2, 'c': 2}
>>> json_tools.diff(a,b)
[{'prev': 1, 'value': 2, 'replace': '/a'}, {'prev': 2, 'remove': '/b'}, {'add': '/c', 'value': 2}]

上面这个比较是比较简单的,显示的是b相对于a的变化,特别注意,如果是b相对a,就要这样写:json_tools.diff(a,b),如果是json_tools.diff(b,a),会跟上面有所不同,请看结果:

>>> json_tools.diff(b,a)
[{'prev': 2, 'value': 1, 'replace': '/a'}, {'prev': 2, 'remove': '/c'}, {'add': '/b', 'value': 2}]

json_tools(a,b),即b相对a发生的变化为例进行说明。

  • b和a都有键'a',但是b相对a,键'a'的值发生了变化,由原来的1,变为了2。所以在比较结果的list中,有一个元素反应了这个结果{'prev': 1, 'value': 2, 'replace': '/a'},其中,replace表示发生变化的键,value表示变化后即当前该键的值,prev表示该键此前的值。
  • b中的'c'相对与a,是新增的键。于是比较结果中这样反应出来:{'add': '/c', 'value': 2}
  • b相对于a没有'b'这个键,也就是在b中将其删除了,于是比较结果中这样来显示:{'prev': 2, 'remove': '/c'}

通过上述结果,就显示出来的详细的比较结果,不仅如此,还能对多层嵌套的json进行比较。例如:

>>> a={"a":{"aa":{"aaa":333,"aaa2":3332},"b":22}}
>>> b={"a":{"aa":{"aaa":334,"bbb":339},"b":22}}
>>> json_tools.diff(a,b)
[{'prev': 3332, 'remove': '/a/aa/aaa2'}, {'prev': 333, 'value': 334, 'replace': '/a/aa/aaa'}, {'add': '/a/aa/bbb', 'value': 339}]

这里就显明了发生变化的key的嵌套关系。比如'/a/aa/aaa2',就表示{"a":{"aa":{"aaa2":...}}}的值发生了变化。

这里有了一个key的嵌套字符串,在真实的使用中,有时候需要将字符串转为json的格式,即{'prev': 3332, 'remove': '/a/aa/aaa2'}转化为{"a":{"aa":{"aaa2":3332}}}

将字符串组装成json格式

首先,回答前面的问题,可以自己写一个函数,实现那种组装。

但是,我是懒惰地程序员,我更喜欢python的原因就是它允许我懒惰。

from itertools import izip
目录
相关文章
|
12天前
|
存储 缓存 JavaScript
python实战篇:利用request库打造自己的翻译接口
python实战篇:利用request库打造自己的翻译接口
26 1
python实战篇:利用request库打造自己的翻译接口
|
23天前
|
Web App开发 Python
在ModelScope中,你可以使用Python的浏览器自动化库
在ModelScope中,你可以使用Python的浏览器自动化库
15 2
|
24天前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
60 0
|
2天前
|
JSON API 数据格式
python的request库如何拿到json的返回值
python的request库如何拿到json的返回值
6 0
|
7天前
|
存储 JSON JavaScript
「Python系列」Python JSON数据解析
在Python中解析JSON数据通常使用`json`模块。`json`模块提供了将JSON格式的数据转换为Python对象(如列表、字典等)以及将Python对象转换为JSON格式的数据的方法。
21 0
|
7天前
|
开发者 Python
Python中使用`requests`库进行文件上传与下载的技术详解
【4月更文挑战第12天】在Python的网络编程中,文件上传和下载是常见的需求。`requests`库作为一个强大且易用的HTTP客户端,为我们提供了简便的文件上传和下载功能。本文将详细介绍如何在Python中使用`requests`库进行文件上传和下载。
|
7天前
|
安全 API 开发者
Python中使用`requests`库进行请求头与自定义参数设置的技术详解
【4月更文挑战第12天】在Python中,`requests`库是一个强大且灵活的HTTP客户端,用于发送所有类型的HTTP请求。在发送请求时,我们经常需要设置请求头和自定义参数来满足不同的需求。本文将详细探讨如何在Python中使用`requests`库进行请求头和自定义参数的设置。
|
10天前
|
存储 JSON 数据挖掘
python逐行读取txt文本中的json数据,并进行处理
Python代码示例演示了如何读取txt文件中的JSON数据并处理。首先,逐行打开文件,然后使用`json.loads()`解析每一行。接着,处理JSON数据,如打印特定字段`name`。异常处理包括捕获`JSONDecodeError`和`KeyError`,确保数据有效性和字段完整性。将`data.txt`替换为实际文件路径运行示例。
11 2
|
15天前
|
数据采集 网络协议 API
python中其他网络相关的模块和库简介
【4月更文挑战第4天】Python网络编程有多个流行模块和库,如requests提供简洁的HTTP客户端API,支持多种HTTP方法和自动处理复杂功能;Scrapy是高效的网络爬虫框架,适用于数据挖掘和自动化测试;aiohttp基于asyncio的异步HTTP库,用于构建高性能Web应用;Twisted是事件驱动的网络引擎,支持多种协议和异步编程;Flask和Django分别是轻量级和全栈Web框架,方便构建不同规模的Web应用。这些工具使网络编程更简单和高效。
|
24天前
|
JSON JavaScript 数据格式
【深入探究C++ JSON库】解析JSON元素的层级管理与遍历手段
【深入探究C++ JSON库】解析JSON元素的层级管理与遍历手段
79 2

热门文章

最新文章