python3 json模块操作

背景

json 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成

一般表现形式是一个无序的 键值对 的集合。

资料:

官方文档: https://docs.python.org/3/library/json.html#module-json

python操作json的其他方式:

 

编码(dump)

1. 将字符串转化为json串(dumps)

import json

a="\"foo\bar"
result=json.dumps(a)
print(result)
print(type(result))

执行结果:

"\"foo\bar"
<class 'str'>

2. 将列表转化为json串(dumps)

import json

a=['foo',{'bar': ('baz',None,1.0,2)}]
result=json.dumps(a)
print(result)
print(type(result))

执行结果:

["foo",{"bar": ["baz",null,2]}]
<class 'str'>

3. 将字典转化为json串(dumps)

import json

a={"c": 0,"b": 0,"a": 0}
result=json.dumps(a)
print(result)
print(type(result))

执行结果:

{"c": 0,"a": 0}
<class 'str'>

4. 转化字典为json串时,进行排序(dumps)

import json

a={"c": 0,"a": 0}
result=json.dumps(a,sort_keys=True)
print(result)

执行结果:

{"a": 0,"c": 0}

对照上一个例子,可以看到json串按照字典的key进行了排序。

5. 定义json串缩进(dumps)

import json

a=[1,2,3,{'4': 5,'6': 7}]
result=json.dumps(a,indent=4)
print(result)

执行结果:

[
    1,{
        "6": 7,"4": 5
    }
]

可以看到json串输出时采用了定义的4个空格进行缩进。

6. 将产生的json串输出文件流(dump)

import json

myfile=open('a.txt','w')

a=[1,'6': 7}]
json.dump(a,myfile,indent=4)

myfile.close()

执行之后,打开 a.txt 文件进行查看:

[
    1,"4": 5
    }
]

 

解码(load)

1. 将json串解码为列表(loads)

import json

json_str='["foo",{"bar":["baz",2]}]'
result=json.loads(json_str)
print(result)
print(type(result))

执行结果:

['foo',{'bar': ['baz',2]}]
<class 'list'>

可以看到,这里讲json串解码为一个list。

2. 将json串解码为字典(loads)

import json

json_str='{"a": 0,"c": 0}'
result=json.loads(json_str)
print(result)
print(type(result))

执行结果:

{'a': 0,'c': 0,'b': 0}
<class 'dict'>

3. 从文件流解码json串(load)

以上面dump生成的a.txt为例。

import json

myfile=open("a.txt",'r')

# json_str='{"a": 0,"c": 0}'
result=json.load(myfile)
print(result)
print(type(result))

myfile.close()

执行结果:

[1,{'6': 7,'4': 5}]
<class 'list'>

可以看到成功将a.txt的内容解码为list。

 

其他

1. dumps 和 dump 的区别

下面是两个函数的定义:

dump(obj,fp,skipkeys=False,ensure_ascii=True,check_circular=True,allow_nan=True,cls=None,indent=None,separators=None,default=None,sort_keys=False,**kw)

dumps(obj,**kw)

可以看到,dump比 dumps多了一个参数 fp。

dumps 会直接将生成的 json串 返回,也就是可以采取 json_str=dumps()的方式来获取结果。

但是 dump 没有返回值,它会将生成的 json串 输出到 fp 流中。

2. loads 和 load 的区别

下面是两个函数的定义:

load(fp,object_hook=None,parse_float=None,parse_int=None,parse_constant=None,object_pairs_hook=None,**kw)

loads(s,encoding=None,**kw)

可以看到 load 的前两个参数是 fp 以及 cls,而 loads 的前两个参数是 s 和 encoding。

loads 会将 json串直接进行解码输出

load 是从 fp 文件流中读取json串,然后进行解码输出。本质load函数定义的时候还是调用的 load函数

3. 抓取请求,并解析json内容

这里采用的是python 的 requests 库进行抓取。

import json
import requests

r=requests.get('http://baike.baidu.com/apI/Openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=%E9%93%B6%E9%AD%82&bk_length=600')
print(type(r.text))

json_str=r.text
result=json.loads(json_str)
print(result)
print(type(result))

if result['id']==26096:
    print("success")
else:
    print("fail")

执行结果如下:

<class 'str'>
{'imageWidth': 512,'totalUrl': 'http://baike.baidu.com/view/26096.htm','card': [{'name': '中文名','format': ['银魂'],'key': 'm21_bookname','value': ['银魂']}],'key': '银魂','id': 26096,'isSummaryPic': 'y','hasOther': 1,……<class 'dict'>
success

这里首先采用request.get 抓取json网页,然后对 r.text 网页内容进行解析。如果网页内容 id 值为 26096的话,这里就打印success。

备注:当然,这里也可以直接使用 r.json()进行json解析。

 

 

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...