94. python如何处理JSON格式数据

JavaScript对象表示法(JSON)是一种轻量级的、基于文本的、语言独立的数据交换格式。这是来自 ECMAScript编程语言标准。JSON定义了一组格式化规则来表示结构化数据,这样就增加了可移植。

JSON格式有四种简单类型, 分别为:

  • 字符串是由0个或多个Unicode字符组成的序列,用双引号括起来,使用反斜线”“转义。字符用单个字符的字符串来表示。字符串非常类似于C或Java字符串。
  • 数字非常类似于C或Java整型数字,但不使用八进制和十六进制格式。
  • 布尔类型,分别为true, false, 必须为小写字符。
  • null。

JSON有两种复合类型,复合类型可以嵌套。

* “名称/值”对集合对象。由顺序无关的“名称/值”对组成,以左花括号开始,以右花括号结束。“名称/值”
对之间由逗号分割,每一个名称后面跟着冒号。
* 有序的列表值,在大多数语言中,是一个数组、向量、链表或序列等。JSON中以数组形式来顺序存储。
数组以左中括号开始,以右中括号结束,数据值以逗号分隔。

以下为两种典型JSON格式文本

{ "action": "ifdown", "interface": "wan" }
{"dns_server": ["58.30.131.33 ", "211.99.143.33"] }

还有简单格式的JSON文本

"Hello world!"

42

true

对于复合类型,通常json库是兼容的,但对于简单类型的JSON格式,某些json库不能处理,但python可以处理。

import json

config1 = json.loads('"hello"')
config2 = json.loads('10')
config3 = json.loads('true')
config4 = json.loads('false')
config5 = json.loads('null')
print(config1, config2, config3)
print(config4, config5)

需要注意,对于字符串需要加引号,对于布尔值是区分大小写的。

python的json库主要有四个函数来对json数据进行处理,分别为load,loads,dump,dumps函数。

  • json.dump 以json格式序列化对象到文件对象中。
  • json.dumps 以json格式序列号对象到字符串中。
  • json.load 反序列化一个对象,即从文件中读取字符串,然后转换为python对象。
  • json.loads 从字符串中反序列化一个对象,即将json格式的字符串转换为python对象。

python对象和json字符串之间的转换规则如下:

JSON Python
集合对象 字典(dict)
数组 列表(list)
字符串 字符串(str)
数字(int) 整形数字(int)
数字(real) 浮点型数字(float)
true True
false False
null None

我们举一个实际的例子, 下面代码演示了调用loads函数从字符串中转换为python对象, 同时也演示了调用dumps函数从python对象转换为json格式的字符串。注释为实际的输出:

import json


config1 = json.loads('{ "action": "ifdown", "interface": "wan" }')
print(type(config1))  #<class 'dict'>
print(config1)        #{'action': 'ifdown', 'interface': 'wan'}

s1 = json.dumps(config1)
print(type(s1))   #<class 'str'>
print(s1)         #{"action": "ifdown", "interface": "wan"}