标签:
注:文章原文为Dr. Charles Severance 的 《Python for Informatics》。文中代码用3.4版改写,并在本机测试通过。
13.4 JavaScript Object Notation-JSON
JSON的格式灵感来自JavaScript语言中的对象和数组格式。因为Python语言的发明比JavaScript要早,所以Python关于词典和列表的语法影响了JSON的语法,故而JSON和Python的词典和列表的结合体几乎完全相同。
以下是JSON的一个编码,它和先前的简单XML大致相同。
{
"name" : "Chuck",
"phone" : {
"type" : "intl",
"number" : "+1 734 303 4456"
},
"email" : {
"hide" : "yes"
}
}
你将注意到两者有一些差异。首先,在XML里,我们可以在"phone"标签里添加像"intl"的属性。在JSON里,我们有的只是简单的键值对。同样XML中"person"的标签不见了,被最外面的一对大括号代替了。
一般来说,JSON的能力比XML弱,所以JSON结构比XML简单。但是JSON拥有映射到词典和链表结合体的优点。并且因为几乎所有的编程语言都拥有和Python等效的词典和列表,JSON是两个程序之间互换数据的非常自然的格式。
因为JSON比XML相对简单,JSON正快速成为程序间互换数据格式的首选。
13.5 分析JSON
我们用需要的词典和列表构建我们的JSON。在下面的例子中,我们示范了一个users列表,列表中的每个user是一个键值对。所以我们拥有的是一个词典的列表。
在下面的程序里,我们使用内置的json库分析JSON,并遍历数据。仔细比较前面等效的XML数据和代码。JSON只有很少的细节,所以我们必须预先知道我们正在获取一个列表,而这个列表中的每个user是一个键值对。JSON比较简洁,但同样自描述较差。
import json text = ‘‘‘ [ {"id" : "001", "x" : "2", "name" : "Chuck" }, {"id" : "009", "x" : "7", "name" : "Brent" } ]‘‘‘ info = json.loads(text) # 原书中用的load方法,但运行时报错 AttributeError: ‘str‘ object has no attribute ‘read‘ print(‘User count:‘,len(info)) for item in info: print(‘Name:‘,item[‘name‘]) print(‘id:‘, item[‘id‘]) print(‘Attribute:‘, item[‘x‘])
如果你比较分别从JSON和XML分析并抓取数据的代码,你会明白json.loads返回的是一个我们能用for循环遍历的列表,而且列表中的每个元素是Python的词典。我们可以使用索引操作符来抓取user的不同信息。一旦JSON被分析,我们将简单地拥有Python对象和结构。因为返回的数据是简单的Python结构,我们不需用json库去深挖被分析的JSON。
这个程序的输出和前面的XML版本一模一样:
User count: 2
Name: Chuck
id: 001
Attribute: 2
Name: Brent
id: 009
Attribute: 7
网页服务从使用XML转向JSON逐渐成为一个工业趋势。因为JSON来得更简单,并且可以更直接的映射到编程语言中已有的原生数据结构,所以使用JSON分析和抓取数据来得更加简单和直接。但是因为XML的自描述能力要比JSON来的强,所以在一些程序中XML还保持着优势。例如,绝大多数的文字处理器更愿使用XML来保存内部文档。
Python for Infomatics 第13章 网页服务二(译)
标签:
原文地址:http://www.cnblogs.com/zhengsh/p/5447515.html