深入理解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 相关文章推荐
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
Jan 22 Python
使用python实现strcmp函数功能示例
Mar 25 Python
Python实现竖排打印传单手机号码易撕条
Mar 16 Python
python在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
python的else子句使用指南
Feb 27 Python
利用Python命令行传递实例化对象的方法
Nov 02 Python
python中实现控制小数点位数的方法
Jan 24 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
虚拟机下载python是否需要联网
Jul 27 Python
Python selenium实现断言3种方法解析
Sep 08 Python
python pyg2plot的原理知识点总结
Feb 28 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概率算法实例
2014/04/09 PHP
typecho插件编写教程(三):保存配置
2015/05/28 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
php实现头像上传预览功能
2017/04/27 PHP
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
jQuery实现tab选项卡效果的方法
2015/07/08 Javascript
js弹出窗口返回值的简单实例
2016/05/28 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
2017/03/30 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
详解几十行代码实现一个vue的状态管理
2019/01/28 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
Vuex实现数据增加和删除功能
2019/11/11 Javascript
js滚轮事件 js自定义滚动条的实现
2020/01/18 Javascript
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
python分割和拼接字符串
2013/11/01 Python
关于Python 3中print函数的换行详解
2017/08/08 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
关于Python中的向量相加和numpy中的向量相加效率对比
2019/08/26 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
写自荐信的七个技巧
2013/10/15 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
装修活动策划方案
2014/08/27 职场文书
党员个人承诺书
2015/04/27 职场文书
工程款申请报告
2015/05/15 职场文书
导游词之青岛太清宫
2019/12/13 职场文书