深入理解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中使用sort()方法进行排序的简单教程
May 21 Python
Python中list初始化方法示例
Sep 18 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
详谈在flask中使用jsonify和json.dumps的区别
Mar 26 Python
python微信撤回监测代码
Apr 29 Python
python射线法判断检测点是否位于区域外接矩形内
Jun 28 Python
Python程序暂停的正常处理方法
Nov 07 Python
使用Python生成200个激活码的实现方法
Nov 22 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
May 15 Python
Python爬虫获取页面所有URL链接过程详解
Jun 04 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 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
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
支持数组的ADDSLASHES的php函数
2010/02/16 PHP
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
2016/06/13 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
vue之延时刷新实例
2019/11/14 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
Python如何用filter函数筛选数据
2020/03/05 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
Java程序开发中如何应用线程
2016/03/03 面试题
Ejb技术面试题
2015/04/29 面试题
环境保护标语
2014/06/20 职场文书
毕业设计论文评语
2014/12/31 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript
python运算符之与用户交互
2022/04/13 Python