学python一直没有用到json库文件,闲下来了,,就研究下怎么解析json数据
一、json.dumps
这个函数主要是用于将数组、列表等格式的数据解析为json格式
1
2
3
4
5
6
|
#-*-coding:utf-8-*-
import json
data = [{‘name’ : ‘adog’ , ‘age’ : 23 , ‘sex’ : ‘male’},{‘name’ : ‘adogy’ , ‘age’ : 24 , ‘sex’ : ‘female’}]
json = json.dumps(data)
print json
|
这里一个数组里我添加了两个List,格式为name、age、sex,用来模拟真实的用户数据
1
|
[{“age”: 23, “name”: “adog”, “sex”: “male”}, {“age”: 24, “name”: “adogy”, “sex”: “female”}]
|
运行结果如上所示,几乎没什么变化,下面我们使用参数来使这个输入更加格式化
1
|
json=json.dumps(data,sort_keys=True,indent=4,separators=(‘,’, ‘:’))
|
①sort_keys
由于dict存储的无序特性,造成两者无法比较。因此两者可以通过排序后的结果进行存储就避免了数据比较不一致的情况发生,但是排序后再进行存储,系统必定要多做一些事情,也一定会因此造成一定的性能消耗,所以适当排序是很重要的。
②indent
输出的数据被格式化之后,变得可读性更强,但是却是通过增加一些冗余的空白格来进行填充的。json主要是作为一种数据通信的格式存在的,而网络通信是很在乎数据的大小的,无用的空格会占据很多通信带宽,所以适当时候也要对数据进行压缩。
③separator
该参数可以起到这样的作用,该参数传递是一个元组,包含分割对象的字符串。
在使用上述参数进行格式化后,输出的确美观了许多~
二、json.loads
json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。
该功能可能会更常用一些,在爬取网站数据时,往往是json格式,因此我们需要使用该函数来对数据进行处理。
1
2
3
4
5
6
|
#-*-coding:utf-8-*-
import json
jsondata=‘{“a”:1 , “c”: 3, “b”: 2, “e”: 5, “d”: 4}’
text=json.loads(jsondata)
print text
|
这是最简单的一个json数据格式,经过loads处理后,解码json数据
1
|
{u‘a’: 1, u‘c’: 3, u‘b’: 2, u‘e’: 5, u‘d’: 4}
|
当然实际情况肯定不会像这个这么简单,下面来构造一些复杂的数据,来实现我们的一些爬取目的
1
2
3
4
5
6
|
#-*-coding:utf-8-*-
import json
jsondata=‘{“a”:{“aa”:11,”aaa”:111} , “c”: 3, “b”: 2, “e”: 5, “d”: 4}’
text=json.loads(jsondata)
print text
|
这里json的解码其实和列表的读取有点类似,我们现在想要读取第一个a里的内容
1
2
3
4
5
|
print text[‘a’]
{u‘aa’: 11, u‘aaa’: 111} //输出
print text[‘a’][‘aa’]
11 //输出
|
所以json的解码还算比较人性化,下面用一个实例来模拟日常需要
先看一个简单的豆瓣的图书查询的api返回
http://api.douban.com/v2/book/isbn/9787218087351
1
|
{“rating”:{“max”:10,“numRaters”:79,“average”:“9.1”,“min”:0},“subtitle”:“”,“author”:[“野夫”],“pubdate”:“2013-9”,“tags”:[{“count”:313,“name”:“野夫”,“title”:“野夫”},{“count”:151,“name”:“散文随笔”,“title”:“散文随笔”},{“count”:83,“name”:“身边的江湖”,“title”:“身边的江湖”},{“count”:82,“name”:“土家野夫”,“title”:“土家野夫”},{“count”:70,“name”:“散文”,“title”:“散文”},{“count”:44,“name”:“中国文学”,“title”:“中国文学”},{“count”:43,“name”:“随笔”,“title”:“随笔”},{“count”:38,“name”:“中国现当代文学”,“title”:“中国现当代文学”}],“origin_title”:“”,“image”:“http://img5.douban.com/mpic/s27008269.jpg”,“binding”:“”,“translator”:[],“catalog”:“自序 让记忆抵抗n001 掌瓢黎爷n024 遗民老谭n039 乱世游击:表哥的故事n058 绑赴刑场的青春n076 风住尘香花已尽n083 “酷客”李斯n100 散材毛喻原n113 颓世华筵忆黄门n122 球球外传:n一个时代和一只小狗的际遇n141 童年的恐惧与仇恨n151 残忍教育n167 湖山一梦系平生n174 香格里拉散记n208 民国屐痕”,“pages”:“256”,“images”:{“small”:“http://img5.douban.com/spic/s27008269.jpg”,“large”:“http://img5.douban.com/lpic/s27008269.jpg”,“medium”:“http://img5.douban.com/mpic/s27008269.jpg”},“alt”:“http://book.douban.com/subject/25639223/”,“id”:“25639223”,“publisher”:“广东人民出版社”,“isbn10”:“7218087353”,“isbn13”:“9787218087351”,“title”:“身边的江湖”,“url”:“http://api.douban.com/v2/book/25639223”,“alt_title”:“”,“author_intro”:“郑世平,笔名野夫,网名土家野夫。毕业于武汉大学,曾当过警察、囚徒、书商。曾出版历史小说《父亲的战争》、散文集《江上的母亲》(获台北2010国际书展非虚构类图书大奖,是该奖项第一个大陆得主)、散文集《乡关何处》(被新浪网、凤凰网、新华网分别评为2012年年度好书)。”,“summary”:“1.野夫书稿中被删减最少,最能体现作者观点、情感的作品。n2.文字凝练,具有极强的感染力。以一枝孤笔书写那些就在你我身边的大历史背景下普通人的生活变迁。n3. 柴静口中“一半像警察,一半像土匪”的野夫,以其特有的韵律表达世间的欢笑和悲苦。”,“price”:“32元”}
|
可以获得这段json数据
首先第一个问题,这是一长段json数据,那么我们如何使用json的dumps或者loads来对数据进行格式化输出
这里选择json.dumps来对json进行格式化输出,loads主要是对json数据进行解码,因此这里可以选择dumps其中的参数来进行格式化
第二个问题,由于这段数据中包含双引号等字符串,在进行json.dumps的时候在会出现这样的转移字符
这就导致了在进行格式化时会出现异常,因此首先我们需要使用replace函数去除转移字符,再对json数据进行dumps
1
|
load=json.loads(data.replace(‘\’,”))
|
但是最后一个问题来了,中文编码的问题
可以看到中文字符已经变成了unicode编码样式,这无疑大大增加了我们的可阅读性,其实编码问题可能是编程里的一大难题,,还好json库自带了参数来解决这样的问题,这里由于python版本是2.7,因此选择使用ensure_ascii这个参数来解码中文
1
|
print json.dumps(‘中国’,ensure_ascii=False)
|
如果是3版本的,则可以使用__future__函数,这里没有做尝试,读者可以自行尝试!
在解决中文编码的问题后,我们在json.dumps()参数里加上这个ensure_ascii
最终代码如下:
1
2
3
4
5
6
|
#-*-coding:utf-8-*-
import json
data=‘{“rating”:{“max”:10,”numRaters”:79,”average”:”9.1″,”min”:0},”subtitle”:””,”author”:[“野夫”],”pubdate”:”2013-9″,”tags”:[{“count”:313,”name”:”野夫”,”title”:”野夫”},{“count”:151,”name”:”散文随笔”,”title”:”散文随笔”},{“count”:83,”name”:”身边的江湖”,”title”:”身边的江湖”},{“count”:82,”name”:”土家野夫”,”title”:”土家野夫”},{“count”:70,”name”:”散文”,”title”:”散文”},{“count”:44,”name”:”中国文学”,”title”:”中国文学”},{“count”:43,”name”:”随笔”,”title”:”随笔”},{“count”:38,”name”:”中国现当代文学”,”title”:”中国现当代文学”}],”origin_title”:””,”image”:”http://img5.douban.com/mpic/s27008269.jpg”,”binding”:””,”translator”:[],”catalog”:”自序 让记忆抵抗n001 掌瓢黎爷n024 遗民老谭n039 乱世游击:表哥的故事n058 绑赴刑场的青春n076 风住尘香花已尽n083 “酷客”李斯n100 散材毛喻原n113 颓世华筵忆黄门n122 球球外传:n一个时代和一只小狗的际遇n141 童年的恐惧与仇恨n151 残忍教育n167 湖山一梦系平生n174 香格里拉散记n208 民国屐痕”,”pages”:”256″,”images”:{“small”:”http://img5.douban.com/spic/s27008269.jpg”,”large”:”http://img5.douban.com/lpic/s27008269.jpg”,”medium”:”http://img5.douban.com/mpic/s27008269.jpg”},”alt”:”http://book.douban.com/subject/25639223/”,”id”:”25639223″,”publisher”:”广东人民出版社”,”isbn10″:”7218087353″,”isbn13″:”9787218087351″,”title”:”身边的江湖”,”url”:”http://api.douban.com/v2/book/25639223″,”alt_title”:””,”author_intro”:”郑世平,笔名野夫,网名土家野夫。毕业于武汉大学,曾当过警察、囚徒、书商。曾出版历史小说《父亲的战争》、散文集《江上的母亲》(获台北2010国际书展非虚构类图书大奖,是该奖项第一个大陆得主)、散文集《乡关何处》(被新浪网、凤凰网、新华网分别评为2012年年度好书)。”,”summary”:”1.野夫书稿中被删减最少,最能体现作者观点、情感的作品。n2.文字凝练,具有极强的感染力。以一枝孤笔书写那些就在你我身边的大历史背景下普通人的生活变迁。n3. 柴静口中“一半像警察,一半像土匪”的野夫,以其特有的韵律表达世间的欢笑和悲苦。”,”price”:”32元”}’
load=json.loads(data.replace(‘\’,”))
print json.dumps(load,indent=4,ensure_ascii=False)
|
当然这里也可以写个requests函数来爬取网页的某些数据api,,这里就省去了。。
最终效果如下:
那么开始对数据进行搜寻
1
2
3
4
5
|
print json.loads(datajson)[“rating”]
{u‘max’: 10, u‘numRaters’: 79, u‘average’: u‘9.1’, u‘min’: 0} //输出
print json.loads(datajson)[“images”][“large”]
http://img5.douban.com/lpic/s27008269.jpg //输出
|
最后说下为啥使用loads和dumps,而不是用load和dump,这里json.dump和json.load函数主要是对文件进行操作,假如我们现在爬取json数据,然后将数据导入文件,那么我们就可以使用json.dump(f)这样来对文件进行操作,load亦是如此~
上述如有不当之处,敬请指出~
题目链接:传送门 密码学不多,就三条,作为一个信息安全学生,密码学什么的最简单了~ 1.哼哼 小猪生活的地方在哪里? ★tip:yitctf{内容为小写} 小猪,联想到猪圈密码,百度详解地址:传送门 根据字符对应可知flag为HACK 2.卢本伟 LOL我只服…
请登录后发表评论
注册