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
相關文章
- C#比較dynamic和Dictionary效能C#
- Java幾種常用JSON庫效能比較JavaJSON
- 3 個 Python 模板庫比較Python
- Python解惑:整數比較 is ==的比較Python
- 6個頂級Python NLP庫的比較!Python
- C# 雜湊表Hashtable與字典表Dictionary<K,V>的比較。C#
- Go和Python比較的話,哪個比較好?GoPython
- 還在比較 JSON 和 XML?Stop!JSONXML
- Python NLP庫top6的介紹和比較Python
- Python NLP庫 Top6的介紹和比較Python
- Python的內建比較函式cmp比較原理剖析Python函式
- SQLServer中XML與JSON應用比較SQLServerXMLJSON
- Jackson Gson Json.simple 比較JSON
- Python的List vs Tuple比較Python
- python字串比較大小Python字串
- Python 模板引擎比較Python
- Python 與 Javascript 比較PythonJavaScript
- 比較 python & perl(轉)Python
- 圖資料庫比較資料庫
- 主流資料庫比較資料庫
- Gson – 比較兩個順序無關的json字串JSON字串
- Java 下的 JSON庫效能比較:JSON.simple vs. GSON vs. Jackson vs. JSONPJavaJSON
- json解析效能比較(gson與jackson)JSON
- JSON-RPC-Java 和DWR比較(轉)JSONRPCJava
- python 批量resize效能比較Python
- Python 解惑:整數比較Python
- Python與Excel VBA比較PythonExcel
- 就Tim Bray對JSON和XML的比較的幾點看法JSONXML
- 開源加密解密庫比較加密解密
- Python小知識之物件的比較Python物件
- python清空字典的兩種方法比較Python
- JVM上容錯庫的初步比較 - frankelJVM
- 比較兩個資料庫的差異資料庫
- C語言的比較庫函式--qsortC語言函式
- MySQL大量資料入庫的效能比較MySql
- 關閉資料庫比較好的方法資料庫
- Python 3 字典(Dictionary)Python
- Java,Python,Scala比較(三)wordcountJavaPython