深入理解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使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
总结Python编程中函数的使用要点
Mar 20 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 Python
Django自定义认证方式用法示例
Jun 23 Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 Python
python如何读写csv数据
Mar 21 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 Python
python中单下划线(_)和双下划线(__)的特殊用法
Aug 29 Python
pytorch多GPU并行运算的实现
Sep 27 Python
解决python使用list()时总是报错的问题
May 05 Python
Pycharm安装python库的方法
Nov 24 Python
python 检测nginx服务邮件报警的脚本
Dec 31 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上传文件的增强函数
2010/07/21 PHP
Laravel手动分页实现方法详解
2016/10/09 PHP
PHP cURL获取微信公众号access_token的实例
2018/04/28 PHP
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
Javascript学习笔记之数组的遍历和 length 属性
2014/11/23 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
基于jQuery倒计时插件实现团购秒杀效果
2016/05/13 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
2018/03/01 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
2018/08/08 jQuery
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
python+matplotlib绘制旋转椭圆实例代码
2018/01/12 Python
python opencv之SIFT算法示例
2018/02/24 Python
Python lambda函数基本用法实例分析
2018/03/16 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
Python函数中不定长参数的写法
2019/02/13 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
Python urllib2运行过程原理解析
2020/06/04 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
南京软件公司的.net程序员笔试题
2014/08/31 面试题
移动通信专业自荐信范文
2013/11/12 职场文书
爱护公共设施倡议书
2014/08/29 职场文书
结婚通知短信大全
2015/04/17 职场文书
第一军规观后感
2015/06/12 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
python Tkinter模块使用方法详解
2022/04/07 Python
Golang获取List列表元素的四种方式
2022/04/20 Golang