深入理解Python对Json的解析


Posted in Python onFebruary 14, 2017

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)。这些结构可以嵌套。

深入理解Python对Json的解析

值(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
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.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对Json解析的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
python应用程序在windows下不出现cmd窗口的办法
May 29 Python
python内置函数:lambda、map、filter简单介绍
Nov 16 Python
Python数据结构与算法之完全树与最小堆实例
Dec 13 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
python3使用pandas获取股票数据的方法
Dec 22 Python
PyQT5 QTableView显示绑定数据的实例详解
Jun 25 Python
Python 中Django安装和使用教程详解
Jul 03 Python
用python给自己做一款小说阅读器过程详解
Jul 11 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
Oct 24 Python
python读取csv文件指定行的2种方法详解
Feb 13 Python
Python模拟登录和登录跳转的参考示例
Oct 30 Python
Python headers请求头如何实现快速添加
Nov 03 Python
Python 2与Python 3版本和编码的对比
Feb 14 #Python
利用Python爬虫给孩子起个好名字
Feb 14 #Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
Feb 14 #Python
让python 3支持mysqldb的解决方法
Feb 14 #Python
python用装饰器自动注册Tornado路由详解
Feb 14 #Python
利用python程序生成word和PDF文档的方法
Feb 14 #Python
Python中类型检查的详细介绍
Feb 13 #Python
You might like
PHP 5.0对象模型深度探索之绑定
2006/09/05 PHP
PHP中用hash实现的数组
2011/07/17 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
一个JQuery操作Table的代码分享
2012/03/30 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
checkbox选中与未选中判断示例
2014/08/04 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
angular bootstrap timepicker TypeError提示怎么办
2017/06/13 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
2017/07/05 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
Python图像处理之gif动态图的解析与合成操作详解
2018/12/30 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
django 简单实现登录验证给你
2019/11/06 Python
python 实现多维数组(array)排序
2020/02/28 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
python中pdb模块实例用法
2021/01/15 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
C#笔试题
2015/07/14 面试题
个人找工作自荐信格式
2013/09/21 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
学校食堂标语
2014/10/06 职场文书
离婚协议书范本(通用篇)
2014/11/30 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫