注:文章原文为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章 网页服务二(译)的更多相关文章

  1. Python for Infomatics 第13章 网页服务四(译)

    这几天因为其他事务,打断了自己的学习计划,今天继续我的翻译,避免又中途而废. 注:文章原文为Dr. Charles Severance 的 <Python for Informatics> ...

  2. Python for Infomatics 第13章 网页服务三(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 13.6 应用程序接口API 现 ...

  3. Python for Infomatics 第13章 网页服务一(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 一旦利用程序通过HTTP协议获得 ...

  4. Python for Infomatics 第12章 网络编程二(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.3 用HTTP协议获取一张 ...

  5. Linux就这个范儿 第13章 打通任督二脉

    Linux就这个范儿 第13章 打通任督二脉 0111010110……你有没有想过,数据从看得见或看不见的线缆上飞来飞去,是怎么实现的呢?数据传输业务的未来又在哪里?在前面两章中我们学习了Linux网 ...

  6. #Python学习笔记:1-3章 (基于《python编程,从入门到实践)

    第1-3章 这个文档是记录我学习python时一些学习笔记以及一些想法也可以称作复习笔记 第一章:起步这一章主要是从第一个"hello world"程序到python环境的搭建与配 ...

  7. Python for Infomatics 第12章 网络编程六(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.9 词汇表 Beautif ...

  8. Python for Infomatics 第12章 网络编程四(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.7 用BeautifulS ...

  9. Python for Infomatics 第12章 网络编程一(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 本书中的许多例子关注的是读取文件 ...

随机推荐

  1. hdu 4329

    problem:http://acm.hdu.edu.cn/showproblem.php?pid=4329 题意:模拟  a.     p(r)=   R'/i   rel(r)=(1||0)  R ...

  2. [CodeWars][JS]实现链式加法

    在知乎上看到这样一个问题:http://www.zhihu.com/question/31805304; 简单地说就是实现这样一个add函数: add(x1)(x2)(x3)...(xn) == x1 ...

  3. appium for hybrid app 处理webview

    之前研究了一段时间的appium for native app 相应的总结如下:                                            appium测试环境搭建 :ht ...

  4. Atom安装以及activate-power-mode atom package插件安装

    1.首先安装node.js,不然没有npm命令可用. 现在很多开源程序都使用npm来管理依赖包,所以node.js必备呀. 2.去下载atom安装包和activate-power-mode-0.5.2 ...

  5. nginx负载均衡集群

    nginx负载均衡集群  0.前言:nginx 负载均衡,属于网络7层模型中的应用层,说白了就是一个代理,要用 upstrem 模块实现,代理则用proxy模块 1.可以针对域名做转发,lvs只能针对 ...

  6. [网络流24题] 搭配飞行员(cogs 14)

    [问题描述]     飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞 ...

  7. 网站添加第三方登陆(PHP版)

    这两周正在写毕业设计,我做的是一个问答网站.先介绍一下这个网站:这是一个关于大学生在线问答的网站,类似知乎和百度知道,不过功能没有人家多,毕竟这个网站我一个人在做.网站部署在阿里云,网站包括API,W ...

  8. Redsi和Memcached区别总结

    首先谈谈Redis和Memcached它们都是缓存在内存中的,唯一的区别就是Redis它本身会周期性的把 更新的一些数据写入到磁盘或者修改操作写入追加的记录文件中,并且在此基础上实现master-sl ...

  9. python os.walk()

    os.walk()返回三个参数:os.walk(dirpath,dirnames,filenames) for dirpath,dirnames,filenames in os.walk(): 返回d ...

  10. [LeetCode] Best Time to Buy and Sell Stock II

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...