JSON是当下常用的数据交换格式,今天在这里向大家介绍下如何用解析JSON数据。

【1-JSON简介】

JSON是一种轻量级的数据交换格式,全称 ,它起初来源于这门语言,但因其采用完全独立于语言的文本格式,所以在使用时与开发语言无关,几乎每门开发语言都有处理JSON的方法。

JSON的数据结构有两种:

1. 键值对的无序集合——对象(),形如:

{'key1': 'value1', 'key2': 'value2'}

2. 值的有序列表——数组(array),形如:

['value1', 'value2']

其中value的类型可以为:、、、array、true、false、nulljson格式解析,但是key的类型只能为。

【2-解析JSON的方法】

在中,我们可以通过json库中的loads函数来实现json的解析,其使用案例如下:

# 导入json库
import json
# 定义一个json字符串
json_str = '[{"a":1,"b":2}, {"c":3,"d":4,"e":5}]'
# 用loads方法读取json字符串,并解析成Python数据结构
json_data = json.loads(json_str)
json_data
# 输出结果
[{'a'1'b'2}, {'c'3'd'4'e'5}]

json格式的数据在解析到中数据结构也会发生相应的变化,解析前后json与数据结构的对应关系如下,其中py2和py3也会有一些差别。

解析JSON时数据结构的转换

JSON中数据结构

中数据结构

中数据结构

dict

dict

array

list

list

str

(int)

int, long

int

(real)

float

float

TRUE

TRUE

TRUE

FALSE

FALSE

FALSE

null

None

None

从上表可以看出,json中的和array会被转化成dict(字典)和list(列表),之后的数据提取就是对字典和列表的操作了。

# 遍历在之前例子中解析后的json,查看其内容
for i in range(len(json_data)):
    sub = json_data[i]
    for j in sub.keys():
        value = sub[j]
        print(value)
# 结果如下
1
2
3
4
5

另外,再向大家推荐一个“神器”,通过.io.json模块中的函数,可以直接将已经解析成dict或list的json转化成,省去了循环提取的操作,方便好用。

# 使用json_normalize函数将解析后的json转化为dataframe
from pandas.io.json import json_normalize
json_normalize(json_data)
# 输出结果
     a    b    c    d    e
0  1.0  2.0  NaN  NaN  NaN
1  NaN  NaN  3.0  4.0  5.0

【3-实战练习】

下面我们用疫情数据来实战练习下对JSON数据的解析:

首先运行下面的代码来获取疫情信息的json数据,并解析为的数据结构,其中数据接口的调取方法会在后续的文章中详细讲解。

# 引入相关库
import json
import requests
from pandas.io.json import json_normalize
# 获取疫情数据
url = "https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5"
headers = {'user-agent''Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36'}
ret = requests.get(url, headers=headers)
text = ret.text
# 将json字符串解析为Python的数据结构
result = json.loads(text)

在中查看解析后的结果,可以看到变量是一个有长度为2的字典,实际的数据都在‘data’这个key对应的值里面,以字符串的形式存储。

json格式解析_解析格式有线耳机有吗_解析格式和数值格式

因此我们需要再次使用loads函数将这个json的字符串进行解析,将其转化为的数据结构。

# 将‘data’所对应的值解析为Python的数据结构
data=json.loads(result['data'])
# 像之前查看result变量一样查看data变量,可以看到疫情数据存在‘areaTree’所对应的值中
world=data['areaTree']
# 使用json_normalize函数一步将数据转化成dataframe
world_df=json_normalize(world)

查看变量,可以看到全球的疫情数据已经被处理成规整的格式了。

json格式解析_解析格式和数值格式_解析格式有线耳机有吗

从上表可以看出,数据源对于中国的数据又做了更详细的划分,我们可以进一步获得全国各省的数据。

# 提取中国各省的疫情数据
china=world_df.loc[world_df.name=='中国','children'].values[0]
# 将各省的疫情数据转化成dataframe
china_df=json_normalize(china)

查看变量,可以看到全国的疫情数据也已经被处理成规整的格式了。

解析格式有线耳机有吗_解析格式和数值格式_json格式解析

最后,我们用提取全国各省疫情数据的方法,对每个省内各地市的疫情数据进行提取json格式解析,最终合并成一个包含了全国数据的。

# 提取各地市的数据,并合并成一个dataframe
china_city=None # 初始化一个变量
for province in china_df.name: # 按照每个省来循环
    city=china_df.loc[china_df.name==province,'children'].values[0# 提取省内各地市的疫情数据
    city_df=json_normalize(city) # 将数据转化成dataframe格式
    city_df['province']=province # 增加一列作为省名
    china_city=city_df.append(china_city) # 将数据添加到全国的汇总数据中
# 选取关注的列并重新设置index
china_city=china_city[[
    'province''name'
    'today.confirm''total.confirm''total.suspect',
    'total.dead''total.deadRate''total.healRate'
]].reset_index(drop=True)

查看变量,可以看到非结构化的json数据已经被转换成了结构化的表格数据,这为我们后续的数据分析以及数据可视化奠定了良好的数据基础。

解析格式有线耳机有吗_解析格式和数值格式_json格式解析

【4-总结】

1. JSON用于数据交换,是文本格式,有和array两种数据机构。

2. 解析JSON的思路是先用json库中的loads函数将文本型的JSON转化成的数据结构(dict或list),再对里面的信息进行提取。

3.提取信息时可以用循环遍历的方式,也可以用函数快速实现。

2020年在线开工开课季大促活动(买课送书)已开始,想学数据分析的朋友直接点击文末的“阅读原文”进入活动页面选课即可!详情也可点击。

可选赠书

json格式解析_解析格式有线耳机有吗_解析格式和数值格式

json格式解析_解析格式和数值格式_解析格式有线耳机有吗

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注