一、Json简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
存储在SQL数据库中的数据往往是规整的,比如这里有一个SQLite数据库的例子:
|
|
上述的数据由行和列组成,其中每列映射到一个已定义的属性,如id或者name。其中每一行代表一个国家,每一列代表了这个国家一些特征。但随着数据量的增加,在存储的时候我们通常不知道数据的确切的结构,这被称为非结构化数据。一个很好的例子就是网站上的访客列表,下面是发送到服务器的事件列表的示例:
|
|
上面列出了三个独立事件。每个事件都有不同的字段,有些字段嵌套在其他字段中。这种类型的数据很难在常规的SQL数据库中存储。所以这种非结构化数据通常以JavaScript对象表示法(JSON)格式存储。JSON是一种将列表和字典等数据结构编码成字符串的方法,这样来确保它们易于被机器读取。尽管JSON以Javascript开头,但它实际上只是一种格式,可以通过任何语言读取。
Json对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
它的值可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
二、Python编码和解析Json
Python有很大的JSON支持。我们可以将列表和字典转换为JSON,并将字符串转换为列表和字典。JSON数据看起来很像Python中的字典(dictionary),其中存储了键和值。
使用 JSON 函数需要导入 json 库:
|
|
函数 | 描述 |
---|---|
json.dumps | 将 Python 对象编码成 JSON 字符串 |
json.loads | 将已编码的 JSON 字符串解码为 Python 对象 |
将Python的字典结构导出到json使用json.dumps()
,将json读成Python的字典结构,使用json.loads()
。
如果不是针对string操作而是对文件操作,分别使用json.load()
函数和json.dump()
函数。
|
|
|
|
在编码JSON的时候,这里我们为了获得漂亮的格式化字符串,可以使用 json.dumps() 的indent参数。 它会使得输出和pprint()函数效果类似。
默认的类型对应如下:
JSON | Python |
---|---|
object | dict |
array | list |
string | unicode |
number (int) | int, long |
number (real) | float |
true | True |
false | False |
null | None |
三、其他数据类型与Json之间的编码和解码
一般来讲,JSON解码会根据提供的数据创建dicts或lists。 如果你想要创建其他类型的对象,可以给 json.loads() 传递object_pairs_hook或object_hook参数。 例如,下面是演示如何解码JSON数据并在一个OrderedDict中保留其顺序的例子:
|
|
|
|
下面是如何将一个JSON字典转换为一个Python对象例子:
|
|
这里,JSON解码后的字典作为一个单个参数传递给 __init__()
。 然后,就可以随心所欲的使用了,比如作为一个实例字典来直接使用它。
|
|
|
|
对象实例通常并不是JSON可序列化的。例如:
|
|
|
|
如果你想序列化对象实例,你可以提供一个函数,它的输入是一个实例,返回一个可序列化的字典。例如:
|
|
下面是如何使用这些函数的例子:
|
|
|
|