深入理解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发送http请求解析返回json的实例
Mar 26 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
Django model序列化为json的方法示例
Oct 16 Python
使用python将请求的requests headers参数格式化方法
Jan 02 Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
python多线程http压力测试脚本
Jun 25 Python
Python3分析处理声音数据的例子
Aug 27 Python
python绘制无向图度分布曲线示例
Nov 22 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
Mar 14 Python
关于Kotlin中SAM转换的那些事
Sep 15 Python
python元组拆包实现方法
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
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
邮箱正则表达式实现代码(针对php)
2013/06/21 PHP
php小经验:解析preg_match与preg_match_all 函数
2013/06/29 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
从JavaScript的函数重名看其初始化方式
2007/03/08 Javascript
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
js 实现 list转换成tree的方法示例(数组到树)
2019/08/18 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
在Python中使用SQLite的简单教程
2015/04/29 Python
解决Python字典写入文件出行首行有空格的问题
2017/09/27 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
python 列表,数组和矩阵sum的用法及区别介绍
2018/06/28 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
什么是CSS3 HSLA色彩模式?HSLA模拟渐变色条
2016/04/26 HTML / CSS
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
初一学生评语大全
2014/04/24 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle
Pandas数据类型之category的用法
2021/06/28 Python