这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » JSON 解析

共2条 1/1 1 跳转至

JSON 解析

高工
2017-11-29 17:41:17     打赏


  1. 首先构建JSON数据结构:

  2. >>> menu = \  

  3. ... {  

  4. ... "breakfast":{  

  5. ...          "hours":"7-11",  

  6. ...          "items":{  

  7. ...                 "breakfast burritors":"$6.00",  

  8. ...                 "pancakes":"$4.00"  

  9. ...                  }  

  10. ...             },  

  11. ... "lunch":{  

  12. ...        "hours":"11-3",  

  13. ...        "items":{  

  14. ...               "hamburger":"$5.00"  

  15. ...                }  

  16. ...         },  

  17. ... "dinner":{  

  18. ...         "hours":"3-10",  

  19. ...         "items":{  

  20. ...                "spaghetti":"$8.00"  

  21. ...                 }  

  22. ...          }  

  23. ... }  

接下来使用dumps()将menu编码为json字符串(menu_json):



[python] view plain copy
  1. >>> import json  

  2. >>> menu_json = json.dumps(menu)  

  3. >>> menu_json  

  4. '{"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):



[python] view plain copy
  1. >>> menu2 = json.loads(menu_json)  

  2. >>> menu2  

  3. {'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值:


[python] view plain copy
  1. >>> now_str = str(now)  

  2. >>> json.dumps(now_str)  

  3. '"2016-01-31 09:32:10.880944"'  

  4. >>> from time import mktime  

  5. >>> now_epoch = int(mktime(now.timetuple()))  

  6. >>> json.dumps(now_epoch)  

  7. '1454261530'  

也可以通过继承修改JSON的编码方式,修改datetime编码方式:



[python] view plain copy
  1. >>> class DTEncoder(json.JSONEncoder):  

  2. ...     def default(self,obj):  

  3. ...         if isinstance(obj,datetime.datetime):  

  4. ...            return int(mktime(obj.timetuple()))  

  5. ...         return json.JSONEncoder.default(self,obj)  

  6. ...   

  7. >>> json.dumps(now,cls=DTEncoder)  

  8. '1454261530'  

新类DTEncoder是JSONEncoder的一个子类。我们需要重载它的default()方法来增加处理datetime的代码。继承确保了剩下的功能与父类的一致性。


函数isinstance()检查obj是否是类datetime.datetime的对象。


[python] view plain copy
  1. >>> type(now)  

  2. <class 'datetime.datetime'>  

  3. >>> isintance(now,datetime.datetime)  

  4. Traceback (most recent call last):  

  5.   File "<stdin>", line 1in <module>  

  6. NameError: name 'isintance' is not defined  

  7. >>> isinstance(now,datetime.datetime)  

  8. True  




专家
2017-11-30 09:19:13     打赏
2楼

谢谢楼主分享。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]