深入理解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实现的下载8000首儿歌的代码分享
Nov 21 Python
用Python实现web端用户登录和注册功能的教程
Apr 30 Python
在Python中用has_key()方法查找键是否存在的教程
May 21 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 Python
PyQt 线程类 QThread使用详解
Jul 16 Python
人机交互程序 python实现人机对话
Nov 14 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
基于Python实现签到脚本过程解析
Oct 25 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
Dec 27 Python
Win 10下Anaconda虚拟环境的教程
May 18 Python
python 实现有道翻译功能
Feb 26 Python
Django显示可视化图表的实践
May 10 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中smarty模板条件判断用法实例
2015/06/11 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
2016/02/26 PHP
复制小说文本时出现的随机乱码的去除方法
2010/09/07 Javascript
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
vue cli使用融云实现聊天功能的实例代码
2019/04/19 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
python在每个字符后添加空格的实例
2018/05/07 Python
python用插值法绘制平滑曲线
2021/02/19 Python
基于Python对数据shape的常见操作详解
2018/12/25 Python
python、Matlab求定积分的实现
2019/11/20 Python
python urllib和urllib3知识点总结
2021/02/08 Python
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
毕业生动漫设计求职信
2013/10/11 职场文书
技术人员面试提纲
2013/11/28 职场文书
产品委托授权书范本
2014/09/16 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
2015年保送生自荐信
2015/03/24 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle
Python OpenCV实现图像模板匹配详解
2022/04/07 Python
Win11快速关闭所有广告推荐
2022/04/19 数码科技