JSON 解析

首先構建JSON數據結構:

>>> menu = \
... {
... "breakfast":{
...          "hours":"7-11",
...          "items":{
...                 "breakfast burritors":"$6.00",
...                 "pancakes":"$4.00"
...                  }
...             },
... "lunch":{
...        "hours":"11-3",
...        "items":{
...               "hamburger":"$5.00"
...                }
...         },
... "dinner":{
...         "hours":"3-10",
...         "items":{
...                "spaghetti":"$8.00"
...                 }
...          }
... }
接下來使用dumps()將menu編碼爲json字符串(menu_json):

>>> import json
>>> menu_json = json.dumps(menu)
>>> menu_json
'{"breakfast": {"items": {"breakfast burritors": "$6.00", "pancakes": "$4.00"}, "hours": "7-11"}, "dinner": {"items": {"spaghetti": "$8.00"}, "hours": "3-10"}, "lunch": {"items": {"hamburger": "$5.00"}, "hours": "11-3"}}'
現在反過來使用loads()把JSON字符串menu_json解析成python的數據結構(menu2):

>>> menu2 = json.loads(menu_json)
>>> menu2
{'breakfast': {'items': {'breakfast burritors': '$6.00', 'pancakes': '$4.00'}, 'hours': '7-11'}, 'dinner': {'items': {'spaghetti': '$8.00'}, 'hours': '3-10'}, 'lunch': {'items': {'hamburger': '$5.00'}, 'hours': '11-3'}}
 你可能會在編碼或者解析json對象時得到異常,包括對象時間datetime:



上述錯誤發生是因爲標準json沒有定義日期或者時間類型,需要自定義處理方式。你可以把datetime轉換成json能理解的類型,比如字符串或者epoch值:

>>> now_str = str(now)
>>> json.dumps(now_str)
'"2016-01-31 09:32:10.880944"'
>>> from time import mktime
>>> now_epoch = int(mktime(now.timetuple()))
>>> json.dumps(now_epoch)
'1454261530'
也可以通過繼承修改JSON的編碼方式,修改datetime編碼方式:

>>> class DTEncoder(json.JSONEncoder):
...     def default(self,obj):
...         if isinstance(obj,datetime.datetime):
...            return int(mktime(obj.timetuple()))
...         return json.JSONEncoder.default(self,obj)
... 
>>> json.dumps(now,cls=DTEncoder)
'1454261530'
新類DTEncoder是JSONEncoder的一個子類。我們需要重載它的default()方法來增加處理datetime的代碼。繼承確保了剩下的功能與父類的一致性。

函數isinstance()檢查obj是否是類datetime.datetime的對象。

>>> type(now)
<class 'datetime.datetime'>
>>> isintance(now,datetime.datetime)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'isintance' is not defined
>>> isinstance(now,datetime.datetime)
True

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