深入理解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中signal包的使用
Nov 13 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
Jun 29 Python
python selenium UI自动化解决验证码的4种方法
Jan 05 Python
Python操作Excel插入删除行的方法
Dec 10 Python
Python一行代码实现快速排序的方法
Apr 30 Python
Django中使用CORS实现跨域请求过程解析
Aug 05 Python
使用python实现kNN分类算法
Oct 16 Python
python add_argument()用法解析
Jan 29 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
Jul 09 Python
pandas to_excel 添加颜色操作
Jul 14 Python
vscode调试django项目的方法
Aug 06 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
Jan 18 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的autoload机制的实现解析
2012/09/15 PHP
php导出excel格式数据问题
2014/03/11 PHP
php 数组元素快速去重
2017/05/05 PHP
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
判断脚本加载是否完成的方法
2009/05/26 Javascript
jQuery 版本的文本输入框检查器Input Check
2009/07/09 Javascript
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
jQuery实现分章节锚点“回到顶部”动画特效代码
2015/10/23 Javascript
Bootstrap零基础入门教程(三)
2016/07/18 Javascript
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
JavaScript面向对象程序设计创建对象的方法分析
2018/08/13 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
vue与django集成打包的实现方法
2019/11/11 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
Python程序退出方式小结
2017/12/09 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
Python求解正态分布置信区间教程
2019/11/20 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
一站式跨境收款解决方案:Payoneer(派安盈)
2018/09/06 全球购物
以下为Windows NT 下的32 位C++程序,请计算sizeof 的值
2016/12/07 面试题
顶岗实习接收函
2014/01/09 职场文书
电脑售后服务承诺书
2014/03/27 职场文书
母亲节寄语大全
2015/02/27 职场文书
个性与发展自我评价
2015/03/06 职场文书
导游词之天津盘山
2019/11/01 职场文书
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python
Python获取字典中某个key的value
2022/04/13 Python