深入理解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 中 Meta Classes详解
Feb 13 Python
利用Python操作消息队列RabbitMQ的方法教程
Jul 19 Python
使用Python &amp; Flask 实现RESTful Web API的实例
Sep 19 Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 Python
PyQt5每天必学之创建窗口居中效果
Apr 19 Python
python安装twisted的问题解析
Aug 21 Python
Django自定义用户登录认证示例代码
Jun 30 Python
python实现动态数组的示例代码
Jul 15 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
Aug 02 Python
详解Python描述符的工作原理
Jun 11 Python
Python函数式编程中itertools模块详解
Sep 15 Python
利用Python脚本写端口扫描器socket,python-nmap
Jul 23 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
15种PHP Encoder的比较
2007/04/17 PHP
php使用Cookie控制访问授权的方法
2015/01/21 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
Javascript变量函数浅析
2011/09/02 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
vue slot 在子组件中显示父组件传递的模板
2018/03/02 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
js实现小时钟效果
2020/03/25 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
Python实现的Kmeans++算法实例
2014/04/26 Python
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
python获取指定网页上所有超链接的方法
2015/04/04 Python
详解在Python程序中自定义异常的方法
2015/10/16 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
python使用tcp实现局域网内文件传输
2020/03/20 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
2018/11/29 Python
Django REST framework视图的用法
2019/01/16 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
英语系本科生求职信范文
2013/12/18 职场文书
施工安全承诺书
2014/05/22 职场文书
职工年度考核评语
2014/12/31 职场文书
离婚协议书范文2015
2015/01/26 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技