深入理解Python對Json的解析_python

來源:互聯網
上載者:User
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 filewith open('data.json', 'w') as f: json.dump(data, f) # Reading data backwith open('data.json', 'r') as f: data = json.load(f)


預設的類型對應如下:


JSON Python
object dict
array list
string unicode
number (int) int, long
number (real) float
true True
false False
null None

其他資料類型與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.shares50>>> data.price490.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 classesclasses = { '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.x2>>> a.y3


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.