深入理解Python對Json的解析

@本文來源於公衆號:csdn2299,喜歡可以關注公衆號 程序員學府
Json是一種常用的數據交換結構,由於輕量、易於閱讀和編寫等特點,在網絡方面應用很廣。下面這篇文章主要介紹了Python對Json解析的相關資料,需要的朋友可以參考借鑑,下面來一起看看吧。

Json簡介

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集。 JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成爲理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成。

它的格式一般是這樣的:

對象是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”後跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。

例如下面這樣:
{"b": "Hello", "c": null, "a": true}
它的值可以是雙引號括起來的字符串(string)、數值(number)、true、false、 null、對象(object)或者數組(array)。這些結構可以嵌套。在這裏插入圖片描述
值(value)可以是雙引號括起來的字符串(string)、數值(number)、true、false、 null、對象(object)或者數組(array)。這些結構可以嵌套。

使用Python編碼和解析Json

Python內置了json包來幫助我們完成對json的操作。

將Python的字典結構導出到json使用json.dumps() ,將json讀成Python的字典結構,使用json.loads() 。

如果不是針對string操作而是對文件操作,分別使用json.load()函數和json.dump()函數。

import json
  
data = {
 'name' : 'ACME',
 'shares' : 100,
 'price' : 542.23
}
  
json_str = json.dumps(data)
data = json.loads(json_str)
  
# Writing JSON data to file
with open('data.json', 'w') as f:
 json.dump(data, f)
  
# Reading data back
with open('data.json', 'r') as f:
 data = json.load(f)

默認的類型對應如下:在這裏插入圖片描述

其他數據類型與Json之間的編碼和解碼

一般來說,Python對json的解析是list或dict之間的操作,如果需要其他類型與json之間轉換,就需要object_hook參數。先定義一個類,將類的字典初始化成json的key-value鍵值對。這樣,json的參數就變成了類的屬性。

將一個JSON字典轉換爲一個Python對象Python

>>> class JSONObject:
...  def __init__(self, d):
...   self.__dict__ = d
...
>>>
>>> data = json.loads(s, object_hook=JSONObject)
>>> data.name
'ACME'
>>> data.shares
50
>>> data.price
490.1

還可以通過指定“函數”來進行轉換。

用函數來指定序列化的方法,即將對象的“屬性-值”對變成字典對,函數返回一個字典,然後json.dumps會格式化這個字典。

如果是通過函數將json變成對象,首先獲得類名,然後通過__new__來創建一個對象(不調用初始化函數),然後將json字典的各個屬性賦給對象。

使用函數指定json轉換方式Python

 def serialize_instance(obj):
 d = { '__classname__' : type(obj).__name__ }
 d.update(vars(obj))
 return d
  
# Dictionary mapping names to known classes
classes = {
 'Point' : Point
}
  
def unserialize_object(d):
 clsname = d.pop('__classname__', None)
 if clsname:
  cls = classes[clsname]
  obj = cls.__new__(cls) # Make instance without calling __init__
  for key, value in d.items():
   setattr(obj, key, value)
  return obj
 else:
  return d

使用方法如下:

>>> p = Point(2,3)
>>> s = json.dumps(p, default=serialize_instance)
>>> s
'{"__classname__": "Point", "y": 3, "x": 2}'
>>> a = json.loads(s, object_hook=unserialize_object)
>>> a
<__main__.Point object at 0x1017577d0>
>>> a.x
2
>>> a.y
3

非常感謝你的閱讀
大學的時候選擇了自學python,工作了發現吃了計算機基礎不好的虧,學歷不行這是沒辦法的事,只能後天彌補,於是在編碼之外開啓了自己的逆襲之路,不斷的學習python核心知識,深入的研習計算機基礎知識,整理好了,我放在我們的微信公衆號《程序員學府》,如果你也不甘平庸,那就與我一起在編碼之外,不斷成長吧!

其實這裏不僅有技術,更有那些技術之外的東西,比如,如何做一個精緻的程序員,而不是“屌絲”,程序員本身就是高貴的一種存在啊,難道不是嗎?[點擊加入]
想做你自己想成爲高尚人,加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章