学学 Python 中操纵 JSON 的常识。学完本文,你能够学到如下内容:
1、JSON 是什么?
2、JSON 与 XML 的优劣差别?
3、将 Python 对象编码成 JSON 字符串
4、将 JSON 字符串解码为 Python 对象
5、解决 JSON 中文乱码问题
JSON 是什么?
JSON 的全称是 JavaScript Object Notation,是一种轻量级的数据交换格局。最后,JSON 只是 JavaScript 的子集,但因为其简略易用而迅速走红。
现今大部分编程语言都反对对 JSON 的解析与生成,而近些年异军突起的 NoSQL 数据库也多参照 JSON 来设计数据存储格局,例如 Mongodb 的 BSON(Binary JSON)。
JSON 有以下六种数据类型:number、boolean、string、null、array、object。前三种很好了解,第四个 null 对应 Python 的 None,最初两种,对应 Python 的列表和字典。
1{
2 "name": "小明",
3 "age": 14,
4 "gender": true,
5 "grade": null,
6 "skills": [
7 "JavaScript",
8 "Java",
9 "Python"
10 ]
11}
JSON 与 XML 的优劣差别?
在 JSON 呈现之前,人们用 XML 在网络上替换数据,在 JSON 呈现后,它基本上就取代了 XML 的地位。两者的共同之处不言而喻,它们都是结构化的语言,都能够用于网络数据的替换。
两者最大的差别在于它们的“出身”不同,也就是它们被发明的目标不同。
XML 是 W3C(万维网联盟)公布的可扩大标记语言(Extensible Markup Language),最后设计来补救 HTML 的有余,以弱小的扩展性满足网络信息公布的须要,与它“同级”的有:XHTML\CSS\ECMAScript 等。它蕴含 DTD、XSD、XPath、XSL 等一大堆简单的标准,在数据存储、扩大及高级检索等方面都有作用。起初被用于网络数据交换,颇有点大材小用的意思,尽管可胜任,却也有点简单和冗余。
而 JSON 是 ECMAScript 规范的子集,设计之初就是为了克服 XML 在数据交换上的劣势,所以一方面,它像 XML 一样具备简洁而清晰的层次结构,另一方面,它比 XML 玲珑粗劣,更加实用于网络数据的传输。
JSON 也不是没有毛病,当构造层级很多的时候,它会让人陷入繁琐简单的数据节点查找中,在可读性上要比 XML 差。
将 Python 对象编码成 JSON 字符串
将 python 的对象转化为字符串,这个过程也称为序列化,与之绝对,将 JSON 字符串转化为 python 对象,这个过程被称为反序列化。
序列化格局如下,json.dumps()把 python 对象序列化,json.dump() 先序列化,而后将内容存入文件:
json.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)
json.dump(obj, fp, , skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False,*kw)
1In [1]: import json
2In [2]: d = dict(name='Tom', age='8', score=88)
3In [3]: json.dumps(d)
4Out[3]: '{"name":"Tom","age":"8","score": 88}'
5In [4]: with open('test.json', 'w') as f:
6 ...: json.dump(d, f)
用的比拟多的参数有:
- ensure_ascii=True 设置是否编码为 ASCII,默认是,若 False,则应用原编码码格局
- indent=None 设置打印时缩进,默认不缩进
- separators=None 设置分隔符,取值是 (item_separator, dict_separator) 元组,默认为(‘,’,’:’),这示意 keys 之间用“,”隔开,而 key 和 value 之间用“:”隔开
- sort_keys=False 设置按 key 值排序,默认不排序
1In [15]: d = dict(name='Python 编程学习圈', age='8', score=88)
2
3In [16]: json.dumps(d)
4Out[16]: '{"name":"Python\\u732b","age":"8","score": 88}'
5
6In [17]: json.dumps(d, ensure_ascii=False, indent=4, sort_keys=True)
7Out[17]: '{\n"age":"8",\n"name":"Python 编程学习圈 ",\n"score": 88\n}'
8
9In [18]: print(json.dumps(d, ensure_ascii=False, indent=4, sort_keys=True))
10{
11 "age": "8",
12 "name": "Python 编程学习圈",
13 "score": 88
14}
将 JSON 字符串解码为 Python 对象
反序列化格局如下,json.loads()从内存中读取内容解析,json.load() 从文件中读取内容解析:
json.loads(s, , encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, *kw)
json.load(fp, , cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, *kw)
1In [1]: import json
2In [2]: d = dict(name='Tom', age='8', score=88)
3In [3]: tom_json = json.dumps(d)
4In [4]: json.loads(tom_json)
5Out[4]: {'age': '8', 'name': 'Tom', 'score': 88}
6In [5]: with open('test.json', 'r') as f:
7 ...: print(json.load(f))
8{'name': 'Tom', 'age': '8', 'score': 88}
json.loads()比 json.load() 多了一个 encoding 参数,能够将传入的字符串从新编码。
解决中文乱码问题
序列化的 ensure_ascii 参数与反序列化的 encoding 绝对应,都是解决字符编码,一旦解决不好,就会导致中文乱码问题。
Python2 的字符编码乌七八糟,也广被人诟病,如果可怜遇到 Python2 我的项目,可参照如下例子解决。
字符串在 Python2 外部的示意是 unicode 编码。因而,在做编码转换时,须要以 unicode 作为两头编码,即先将其余编码的字符串解码(decode)成 unicode,再从 unicode 编码(encode)成另一种编码。
1# -*- coding: utf-8 -*-
2m = {'a' : '你好'}
3
4print m
5=>{'a': '\xe4\xbd\xa0\xe5\xa5\xbd'}
6
7print json.dumps(m)
8=>{"a": "\u4f60\u597d"}
9
10print json.dumps(m,ensure_ascii=False)
11=>{"a": "浣犲ソ"}
12
13print json.dumps(m,ensure_ascii=False).decode('utf8').encode('gb2312')
14=>{"a": "你好"}
Python3 的默认编码格局是 utf-8,以上例子,只须要 ensure_ascii=False,就能解决。
以上就是本次分享的所有内容,想要理解更多 python 常识欢送返回公众号:Python 编程学习圈,发送“J”即可收费获取,每日干货分享