本文将介绍 Python 中JSON与XML格式,JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)都是用于结构化数据表示、存储和传输的格式。
1
JSON文件

JSON 全称:JavaScript Object Notation(JavaScript 对象表示法),是一种轻量级的文本数据交换格式。
一个典型的 JSON 格式的字符串如下:
{"students":[{ "name":"张三" , "age": 15 },{ "name":"李四" , "age": 16 },{ "name":"王五" , "age": 17 }]}
JSON 中数据都以名称:值的形式表示,名称包括在一对双引号" "中,值则有多种形式,多条数据之间用逗号,隔开,比如:
"name":"张三""name":"张三","age":15
这种表示方式与 Python 的dict类似。
1
数据类型
JSON 的值可以是如下类型:
字符串(在双引号中)
数字(整数或浮点数)
逻辑值(true 或 false)
数组(在中括号中)
对象(在大括号中)
null
比如:
"name":"张三" , "age":15 , "weight":50 , "ismale" : false 
2
数组
JSON 的数组用一对方括号[]表示,类似于list,数组元素用逗号,隔开,元素值可以是任意 JSON 数据类型,比如:
"names":["张三","李四","王五"]"ages":[15,16,17]

3
对象
JSON 的对象用一对大括号{}表示,类似于dict,对象可以拥有多个名称/值 对,名称/值 对用逗号,隔开,比如:
"first":{ "name":"张三" , "age": 15 }
4
json库
json库是 Python 内置的一个用于操作 JSON 数据的库,提供了几个函数用于解析与生成(或者说反序列化与序列化)JSON 格式的数据。
解析JSON数据(JSON数据对象类型变为Python基础数据类型)
json库提供了一个函数loads,用于从 Python 的字符串中解析 JSON 数据。使用它的方法很简单,只需将含有 JSON 数据的字符串当做参数传递给它,它的返回值就是由 Python 中的基础数据类型组成的对象。
import jsondata = '{"a":1,"b":2,"c":3,"d":4,"e":5}';text = json.loads(data)print(text)
得到的结果是:
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}JSON 的对象类型转换成了 Python 的dict类型。
JSON 各种数据类型在解析后,对应的 Python 基础数据类型如下表:
| JSON | Python |
|---|---|
| object(对象) | dict |
| array(数组) | list |
| string(字符串) | unicode |
| number (int) | int, long |
| number (real) | float |
| true | True |
| false | False |
| null | None |
JSON 数据类型转化成 Python 数据类型后,就可以按照 Python 的方式来使用了:
import jsondata = '[1,2,3]';text = json.loads(data)text.append(4)#调用list的append函数print(text)
得到的结果是:
[1, 2, 3, 4]如果需要以不同的字符编码来解析,可以指定encoding参数,比如:
import jsondata = '{"a":1,"b":2,"c":3,"d":4,"e":5}';text = json.loads(data,encoding = "utf-8")print(text)
上面的代码以utf-8的字符编码,解析data字符串的数据。
注意:如果字符编码指定错误,有可能会导致解析失败,引发异常。
生成JSON数据(将对象转换为JSON数据类型)
与解析的那两个函数相对应,json库也提供了两个函数:dumps和dump,来将由 Python 基础数据类型组成的对象转化成 JSON 数据,使用方法也类似:
import jsondata = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]json = json.dumps(data)#转化成JSON格式的字符串print(json)
得到的结果是:
[{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]这是一个字符串
同样,在转化的时候,也有一个 Python 基础数据类型到 JSON 数据类型的对应表格:
| Python | JSON |
|---|---|
| dict | object(对象) |
| list,tuple | array(数组) |
| str,unicode | string(字符串) |
| int, long,float | number (int) |
| True | true |
| False | false |
| None | null |
注意:dumps函数没有可选参数encoding,当要转化的对象含有中文等非 ASCII 字符时,建议指定可选参数ensure_ascii为False。否则非 ASCII 的字符将会被显示成\uXXXX的形式:
data = {"name":"小明"}print(json.dumps(data))#ensure_ascii默认值为Trueprint(json.dumps(data,ensure_ascii= False))#指定ensure_ascii为False
上面的代码的结果:
{"name": "\u5c0f\u660e"}{"name": "小明"}使用dump函数直接输出到文件也很简单,只需多传递一个文件对象作为参数。
import jsonfp = open("test.txt","w")data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]json.dump(data,fp)#转化成JSON格式的字符串后输出到文件fp.close()
test.txt文件的内容:
[{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]dump函数同样没有可选参数encoding,如果有数据中有中文字符等非 ASCII 字符时,建议指定可选参数ensure_ascii为False。

2
XML格式

XML 全称可扩展标记语言(EXtensible Markup Language),是一种用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型。
一个典型的 XML 文件结构如下:
<?xml version="1.0" encoding="UTF-8"?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>
1
XML的声明
XML文档的声明是可选的,如果需要声明,需要将其放在文档的第一行最顶端
<?xml version="1.0" encoding="UTF-8"?>以上定义了 XML 的版本1.0和所使用的编码utf-8。

2
元素
XML 元素指的是 XML 文件中出现的标签,一个标签分为开始标签和结束标签,结束标签与开始标签名称相同,只是要在前面加一个斜杠/,比如:
<hello></hello><to></to>
一个标签中也可以嵌套其他的若干个子标签。但所有的标签必须合理的嵌套,绝不允许交叉嵌套,比如:
<student><name>张三</name><age>16</age></student>
以上是一个正确嵌套的例子。
格式良好的 XML 文档必须有且仅有一个根元素,其他的元素都是这个元素的子孙元素。
元素的命名规则:
名称可以包含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字母 xml(或者 XML、Xml 等等)开始
名称不能包含空格
名称是大小写敏感的
XML 没有保留字,元素名称可以任意使用。
【示例】:
<hello></hello><F12></F12><if></if><!--上面这些都是合理的名称--><!--下面这些都是不合理的名称--><.123></.123><AD></A D><hello></Hello> <!-- 这一个是因为开始标记(hello)和结束标记(Hello)名称不同 -->

3
属性
一个元素可以有多个属性,每个属性都有它自己的名称和取值。同一个元素下,属性名称不能重复。属性的值一定要用双引号或者单引号括起来,比如:
<date year="2018" month="7" day="28"></date>以上是一个格式正确的例子。
属性的命名规范和元素的命名规范一样。

4
2
注释
XML 文件中注释采用:<!--注释内容--> 这样的格式,注释没有结束标签,不能嵌套。举例如下:
<!--一个正确的注释1--><hello><!--一个正确的注释2--></hello><!--<!--一个发生嵌套的错误的注释-->-->
