携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
JSON是一种轻量级的文本数据交换格式。与XML 相比,拥有更小、更快、更易解析的特点。
JSON 中数据都以名称:值的形式表示,名称包括在一对双引号" "中,值则有多种形式,多条数据之间用逗号,隔开
1.数据类型
JSON 的值可以是如下类型:
- 字符串(在双引号中)
- 数字(整数或浮点数)
- 逻辑值(
true或false) - 数组(在中括号中)
- 对象(在大括号中)
null
2.数组
JSON 的数组用一对方括号[]表示,类似于list,数组元素用逗号,隔开,元素值可以是任意 JSON 数据类型
json库提供了一个函数loads,用于从 Python 的字符串中解析 JSON 数据。使用它的方法很简单,只需将含有 JSON 数据的字符串当做参数传递给它,它的返回值就是由 Python 中的基础数据类型组成的对象。
- JSON 各种数据类型在解析后,对应的 Python 基础数据类型如下表:
| JSON | Python |
|---|---|
| object(对象) | dict |
| array(数组) | list |
| string(字符串) | unicode |
| number (int) | int, long |
| number (real) | float |
| true | True |
| false | False |
| null | None |
- Python 基础数据类型到 JSON 数据类型的对应表格:
| Python | JSON |
|---|---|
| dict | object |
| list, tuple | array |
| str, unicode | string |
| int, long, float | number |
| True | true |
| False | false |
| None | null |
注意:dumps没有可选参数encoding,当要转化的对象含有中文等非 ASCII 字符时,建议指定可选参数ensure_ascii为False。否则非 ASCII 的字符将会被显示成\uXXXX的形式 |
3.元素的命名规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
- 名称是大小写敏感的
一个元素可以有多个属性,每个属性都有它自己的名称和取值。同一个元素下,属性名称不能重复。属性的值一定要用双引号或者单引号括起来
4.事件处理器
事件处理器则负责对事件作出响应,对传递的 XML 数据进行处理。
一个事件处理器必须是ContentHandler类型的子类,通过重写父类的以下函数来响应解析器的事件请求:
-
cha\fracters(content)函数,它会在以下时机被调用:- 如果从一行开始,遇到标签之前,存在字符,则
content的值为这些字符串; - 如果从一个标签,遇到下一个标签之前,存在字符,则
content的值为这些字符串; - 如果从一个标签,遇到行结束符(换行符)之前,存在字符,则
content的值为这些字符串; - 标签可以是开始标签,也可以是结束标签。
- 如果从一行开始,遇到标签之前,存在字符,则
startDocument()函数,它在文档启动的时候调用;endDocument()函数,它在解析器到达文档结尾时调用;startElement(name, attrs)函数,它在遇到 XML 开始标签时调用,name是标签的名字,attrs是标签的属性值字典;endElement(name)函数,它在遇到 XML 结束标签时调用。
xml.etree.ElementTree`模块是一个轻量级的 DOM(文件对象模型),具有方便友好的 API。代码可用性好,速度快,消耗内存少。\
ElementTree模块大致可以三部分:ElementTree类,Element类以及一些操作 XML 的函数。
5.查找元素
Element对象和ElementTree对象都提供了用于在子元素查找元素的函数:
find(name):用于在直接子元素中,查找一个名为name的元素;findall(name):用于在直接子元素中,查找所有名为name的元素,它的返回值可以看做一个所有元素都是Element对象的tuple对象,可以对它进行迭代操作或者索引[]操作;iter(name = None):用于在当前元素下的所有子元素中,查找名为name的元素,如果不指定name,则返回所有子元素。它返回一个迭代器对象。