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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值