一、JSON概述

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

相对于python解析XML来说,个人感觉json的格式返回较有优势,现在一般的api返回都会有json与XML格式的选择,json的解析起来个人觉得相对简单些。

二、示例

先看一个简单的豆瓣的图书查询的api返回:http://api.douban.com/v2/book/isbn/9787218087351 ,直接打开显示看起来比较混乱,所以这里整形下如下:

 1{
 2rating: {
 3    max: 10,
 4    numRaters: 79,
 5    average: "9.1",
 6    min: 0
 7},
 8subtitle: "",
 9author: [
10    "野夫"
11],
12pubdate: "2013-9",
13tags: [
14    {
15    count: 313,
16    name: "野夫",
17    title: "野夫"
18    },
19    {
20    count: 151,
21    name: "散文随笔",
22    title: "散文随笔"
23    },
24    {
25    count: 83,
26    name: "身边的江湖",
27    title: "身边的江湖"
28    },
29    {
30    count: 82,
31    name: "土家野夫",
32    title: "土家野夫"
33    },
34    {
35    count: 70,
36    name: "散文",
37    title: "散文"
38    },
39    {
40    count: 44,
41    name: "中国文学",
42    title: "中国文学"
43    },
44    {
45    count: 43,
46    name: "随笔",
47    title: "随笔"
48    },
49    {
50    count: 38,
51    name: "中国现当代文学",
52    title: "中国现当代文学"
53    }
54],
55origin_title: "",
56image: "http://img5.douban.com/mpic/s27008269.jpg",
57binding: "",
58translator: [ ],
59catalog: "自序 让记忆抵抗 001 掌瓢黎爷 024 遗民老谭 039 乱世游击:表哥的故事 058 绑赴刑场的青春 076 风住尘香花已尽 083 “酷客”李斯 100 散材毛喻原 113 颓世华筵忆黄门 122 球球外传: 一个时代和一只小狗的际遇 141 童年的恐惧与仇恨 151 残忍教育 167 湖山一梦系平生 174 香格里拉散记 208 民国屐痕",
60pages: "256",
61images: {
62    small: "http://img5.douban.com/spic/s27008269.jpg",
63    large: "http://img5.douban.com/lpic/s27008269.jpg",
64    medium: "http://img5.douban.com/mpic/s27008269.jpg"
65},
66alt: "http://book.douban.com/subject/25639223/",
67id: "25639223",
68publisher: "广东人民出版社",
69isbn10: "7218087353",
70isbn13: "9787218087351",
71title: "身边的江湖",
72url: "http://api.douban.com/v2/book/25639223",
73alt_title: "",
74author_intro: "郑世平,笔名野夫,网名土家野夫。毕业于武汉大学,曾当过警察、囚徒、书商。曾出版历史小说《父亲的战争》、散文集《江上的母亲》(获台北2010国际书展非虚构类图书大奖,是该奖项第一个大陆得主)、散文集《乡关何处》(被新浪网、凤凰网、新华网分别评为2012年年度好书)。",
75summary: "1.野夫书稿中被删减最少,最能体现作者观点、情感的作品。 2.文字凝练,具有极强的感染力。以一枝孤笔书写那些就在你我身边的大历史背景下普通人的生活变迁。 3. 柴静口中“一半像警察,一半像土匪”的野夫,以其特有的韵律表达世间的欢笑和悲苦。",
76price: "32元"
77}

下面我们通过python来取出想要的信息,比如我们想要rating,images里的large和summary :

1import urllib2
2import json
3html = urllib2.urlopen(r'http://api.douban.com/v2/book/isbn/9787218087351')
4hjson = json.loads(html.read())
5print hjson['rating']
6print hjson['images']['large']
7print hjson['summary']

执行后结果如下:

1[root@361way tmp]# python json_test.py
2{u'max': 10, u'numRaters': 3302, u'average': u'8.5', u'min': 0}
3http://img4.douban.com/lpic/s27008269.jpg
41.野夫书稿中被删减最少最能体现作者观点情感的作品
52.文字凝练具有极强的感染力以一枝孤笔书写那些就在你我身边的大历史背景下普通人的生活变迁
63. 柴静口中一半像警察一半像土匪的野夫以其特有的韵律表达世间的欢笑和悲苦
7[root@361way tmp]# cat json_test.py

上面可以看到json.loads是将适合json格式读取的数据,载入为json格式解析,便于近一步取值。格式化json输出可以使用json.dumps ,如下:

1import urllib2
2import json
3html = urllib2.urlopen(r'http://api.douban.com/v2/book/isbn/9787218087351')
4hjson = json.loads(html.read())
5print json.dumps(hjson,indent=4,encoding='utf-8'

json官方说明参见:http://json.org

Python操作json的标准api库参考:http://docs.python.org/library/json.html