用 Python 操作 JSON 类型数据详解

论坛 期权论坛 期权     
Python中文社区   2019-6-16 04:40   2949   0
JSON简介
  1. JSON(JavaScript Object Notation)
复制代码
是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
JSON官方网站
  1. http://www.json.org/
复制代码
JSON是一种基于文本,独立于语言的轻量级数据交换格式。JSON的基本语法如下:
1、JSON名称/值对。JSON 数据的书写格式是:名称/值对。名称/值对包括字段名称(在双引号中),然后着是一个冒号(:),最后是值。比如
  1. { "name" : "Python" }
复制代码
,类似于Python中的字典。
2、JSON值。JSON值可以是数字(整数或浮点数),字符串(在双引号中),逻辑值(True 或False),数组(在中括号中),对象(在大括号中)和null。例如
  1. { "age": 21,"graduated ":true }
复制代码
。JSON值的基本格式如下图所示。


图 JSON值的基本格式
3、JSON对象。JSON 对象在花括号({})中书写,对象可以包含多个名称/值对,多个JSON名称/值以”,”进行分隔。例如
  1. { "name":"Pyton" , "age": 25}
复制代码
。JSON对象的基本格式如下图所示。


图 JSON对象
4、JSON 数组。JSON 数组在方括号中书写,数组可包含多个JSON对象。例如:
  1. {
  2.     "sites": [
  3.         { "name": "jd",  "url": "www.jd.com"   },
  4.         { "name": "taobao",   "url": "www.taobao.com" }
  5.     ]
  6. }
复制代码
在本例中对象
  1. ”sites”
复制代码
是包含2个对象的数组。JSON数组的的基本格式如下图所示。


Python操作JSON
Pythone3标准库有JSON模块,主要执行序列化和反序列化功能。
  • 序列化(encoding) : 把一个Python对象编码转化为JSON字符串。
  • 反序列化(decoding):把JSON格式字符串解码转换为Python数据对象。
1、json模块的主要函数
在Python3的json模块中json.dumps()函数将Python对象编码成JSON字符串。使用的语法如下:
  1. import json
  2. dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
复制代码
主要参数说明:
    1. sort_keys
    复制代码
    :表示序列化JSON对象时是否对字典的key进行排序,字典默认是无序的。
    1. indent
    复制代码
    :表示缩进,可以是数据格式可读性更强,格式化输出JSON字符串,如果ident是一个非负的整数,那么JSONarray元素和object成员将会被以相应的缩进级别进行打印输出。
    1. separators
    复制代码
    :当使用ident参数时json模块序列化Python对象后得到的JSON字符串中的”,”号和”:”号分隔符后默认会附加一个空白字符,可以通过separators参数重新指定分隔符,去除无用的空白字符。指定的分隔符一般是一个元祖类型的数据,比如(',',':')。
使用json模块的json.load()函数,将JSON格式的字符串转换成Python对象,使用的语法格式如下:
  1. import json
  2. json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
复制代码
2、JSON字符串与Python 原始类型之间数据类型对应关系
Python 原始类型向JSON类型的转化对照表,如表所示:


表 Python原始类型向JSON类型的转化对照表
JSON类型向Python 原始类型的转化对照表,如表所示:


表 JSON类型向Python原始类型的转化对照表
3、序列化操作实例
  1. import json
  2. data ={'name':"wangwu" , 'lang': ('python' ,'java'), 'age':20 }
  3. data_json = json.dumps( data )
  4. print( data)
  5. # 输出结果为[{'name': 'wangwu', 'lang': ('python', 'java'), 'age': 20}]
  6. print( data_json )
  7. # 输出结果为 [{"name": "wangwu", "lang": ["python", "java"], "age": 20}]
复制代码
从返回结果可以看出data_json字符串中lang数据类型从元祖变成了列表。
还可以对打印的json字符进行美化,可以使用如下Python语句。
  1. data_json = json.dumps(data,sort_keys = True, indent=2 )
  2. print( data_json )
复制代码
输出结果为
  1. {
  2.   "age": 20,
  3.   "lang": [
  4.     "python",
  5.     "java"
  6.   ],
  7.   "name": "wangwu"
  8. }
复制代码
如果要对输出json字符串去除无用的空白字符,可以使用如下Python语句。
  1. data_json = json.dumps(data,sort_keys = True,separators=(',',':') )
  2. print( data_json )
复制代码
输出结果为:
  1. {"age":20,"lang":["python","java"],"name":"wangwu"}
复制代码
4、反序列化操作实例,把JSON格式字符串转换为Python对象
  1. new_data = json.loads(data_json )
  2. print(new_data )
  3. print(type(new_data))
复制代码
输出结果为:
  1. {'age': 20, 'lang': ['python', 'java'], 'name': 'wangwu'}
复制代码
从返回结果可以看出,解码后并没有将原始数据data_json的lang数据还原成元祖,而是还原成了列表。
自定义对象的序列化
如果是类对象,是不是可以可以直接用json.dumps(obj)序列化对象呢?答案是不可以的,需要在类对象里编写转换函数。
例子:自定义对象的序列化
  1. import json
  2. class Man(object):
  3.     def __init__(self, name, age ):
  4.         self.name = name
  5.         self.age = age
  6. #序列化函数
  7. def obj2json(obj):
  8.     return {
  9.             "name" : obj.name,
  10.             "age" : obj.age
  11.             }
  12. man = Man('tom' , 21)
  13. jsonDataStr = json.dumps( man , default=obj2json)
  14. print( jsonDataStr )
复制代码
运行脚本得到以下输出结果:
  1. {"name": "tom", "age": 21}
复制代码
json.dumps()函数中的可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Man专门写一个转换函数,再把函数传进去即可。
通过一种简单的方式,用lambda方式来转换任意一个类对象为JSON形式。
  1. jsonDataStr = json.dumps(man, default=lambda obj: obj.__dict__)
复制代码
  1. lambda obj: obj.__dict__
复制代码
会将任意的对象的属性,转换成字典的方式。同样的道理,如果要将JSON对象反序列化,也需要写个反序列化函数来转换。
  1. json.loads(json_str, object_hook=handle)
  2. import json
  3. class Man(object):
  4.     def __init__(self, name, age ):
  5.         self.name = name
  6.         self.age = age
  7. def obj2json(obj):
  8.     return {
  9.             "name" : obj.name,
  10.             "age" : obj.age
  11.             }
  12. # 反序列化处理函数
  13. def handle( obj ):
  14.     print( type(obj))
  15.     return Man(obj['name'] , obj['age'])
  16. man = Man('tom' , 21)
  17. jsonDataStr = json.dumps( man , default=obj2json)
  18. jsonObj = json.loads(jsonDataStr, object_hook=handle  )
复制代码
在本例中编写反序列化函数handle()把JSON字符串转换成Python类的对象。
留言回复你用Python做过哪些有趣的应用项目,我们会在留言中随机抽取一位读者免费送出北京大学出版社出版的《Python 3 数据分析与机器学习实战》图书一本。


热 门 推 荐
用Python查看微信共同好友
用Python获取摄像头并实时控制人脸

用 Python 验证股神巴菲特的投资经验

开源项目 | 如何免费创建云端爬虫集群

用Python分析《都挺好》中的人物关系

推荐Python中文社区旗下的几个服务类公众号

文章节选自北京大学出版社出版的《Python 3 数据分析与机器学习实战》,本书现在京东参加满100减50的活动,点击阅读原文购书有优惠~
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:200
帖子:40
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP