深入理解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中使用插入排序算法的简单分析与代码示例
May 04 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
Jun 29 Python
Python端口扫描简单程序
Nov 10 Python
python getopt详解及简单实例
Dec 30 Python
Python处理PDF及生成多层PDF实例代码
Apr 24 Python
Python 编码Basic Auth使用方法简单实例
May 25 Python
使用Python OpenCV为CNN增加图像样本的实现
Jun 10 Python
python同步windows和linux文件
Aug 29 Python
pygame实现俄罗斯方块游戏(对战篇1)
Oct 29 Python
python3连接mysql获取ansible动态inventory脚本
Jan 19 Python
Ubuntu20下的Django安装的方法步骤
Jan 24 Python
python爬虫线程池案例详解(梨视频短视频爬取)
Feb 20 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
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
ThinkPHP中的常用查询语言汇总
2014/08/22 PHP
php 如何获取文件的后缀名
2016/06/05 PHP
php实现微信扫码支付
2017/03/26 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
jquery CSS选择器笔记
2010/03/29 Javascript
本地对象Array的原型扩展实现代码
2010/12/04 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
2015/11/29 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
2016/12/20 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
JavaScript字符串检索字符的方法
2017/06/23 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
Python打包方法Pyinstaller的使用
2018/10/09 Python
Python对象中__del__方法起作用的条件详解
2018/11/01 Python
python2.7使用plotly绘制本地散点图和折线图
2019/04/02 Python
Python实现非正太分布的异常值检测方式
2019/12/09 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
劳动争议和解协议书范本
2014/11/20 职场文书
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技