深入理解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模块学习 filecmp 文件比较
Aug 27 Python
Python中的生成器和yield详细介绍
Jan 09 Python
python复制文件的方法实例详解
May 22 Python
python中 logging的使用详解
Oct 25 Python
Python装饰器语法糖
Jan 02 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
python 日期排序的实例代码
Jul 11 Python
Python实现计算长方形面积(带参数函数demo)
Jan 18 Python
快速解决jupyter启动卡死的问题
Apr 10 Python
python怎么删除缓存文件
Jul 19 Python
python 如何实现遗传算法
Sep 22 Python
使用Python爬取Json数据的示例代码
Dec 07 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+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
定义php常量的详解
2013/06/09 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
jQuery EasyUI 中文API Button使用实例
2010/04/14 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
基于AngularJS实现iOS8自带的计算器
2016/09/12 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
webpack之devtool详解
2018/02/10 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
openlayers 3实现车辆轨迹回放
2020/09/24 Javascript
Python实现二分法算法实例
2015/02/02 Python
介绍Python中的一些高级编程技巧
2015/04/02 Python
使用Python编写vim插件的简单示例
2015/04/17 Python
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
Python使用struct处理二进制的实例详解
2017/09/11 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
python绘制圆柱体的方法
2018/07/02 Python
python实现简单的文字识别
2018/11/27 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
自考毕业生自我鉴定
2013/11/04 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
爱心募捐感谢信
2015/01/22 职场文书
干部考核工作总结
2015/08/12 职场文书
javascript Number 与 Math对象的介绍
2021/11/17 Javascript
OpenCV实现反阈值二值化
2021/11/17 Java/Android
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技