JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML。JSON 比 XML 更小、更快,更易解析。Pandas 可以很方便的处理 JSON 数据。
Pandas 可以很方便的处理 JSON 数据。
sites.json
[
{
"id": "A001",
"name": "百度",
"url": "www.baidu.com",
"likes": 1
},
{
"id": "A002",
"name": "新浪",
"url": "www.sina.com.cn",
"likes": 2
},
{
"id": "A003",
"name": "淘宝",
"url": "www.taobao.com",
"likes": 3
},
{
"id": "A004",
"name": "天猫",
"url": "www.tmall.com",
"likes": 4
}
]
import pandas as pd
import json
df1 = pd.read_json('sites.json')
print(df1)
运行效果:
id name url likes
0 A001 百度 www.baidu.com 1
1 A002 新浪 www.sina.com.cn 2
2 A003 淘宝 www.taobao.com 3
3 A004 天猫 www.tmall.com 4
也可以从URL中读取 JSON 数据。
import pandas as pd
import json
url = "https://www.simoniu.com/commons/items/130"
df2 = pd.read_json(url)
print(df2)
运行效果:
code msg data
buyCount 200 查询商品信息成功! 0
buyNum 200 查询商品信息成功! 0
catalog 200 查询商品信息成功! 手机
city 200 查询商品信息成功! 广州
createTime 200 查询商品信息成功! 2021-05-11 11:17:23
discount 200 查询商品信息成功! 0
flag 200 查询商品信息成功! True
freePost 200 查询商品信息成功! False
id 200 查询商品信息成功! 130
modifyTime 200 查询商品信息成功! 2021-05-11 11:17:23
name 200 查询商品信息成功! oppo A9
number 200 查询商品信息成功! 0
pic 200 查询商品信息成功! https://img.simoniu.com/good_56.jpg
price 200 查询商品信息成功! 0.1
property 200 查询商品信息成功! None
province 200 查询商品信息成功! 广东
shopId 200 查询商品信息成功! 100
shopName 200 查询商品信息成功! None
status 200 查询商品信息成功! 0
version 200 查询商品信息成功! 0
webSiteId 200 查询商品信息成功! 2
如果想实现格式扁平化,这时我们就需要使用到 json_normalize() 方法将内嵌的数据完整的解析出来,程序改写如下:
import pandas as pd
import json
import requests
url = "https://www.simoniu.com/commons/items/130"
json_str = requests.get(url=url)
data =json.loads(json_str.text)
df2 = pd.json_normalize(data, meta=['code', 'msg'])
print(df2.to_string())
运行效果:
code msg data.version data.createTime data.modifyTime data.flag data.id data.name data.pic data.price data.number data.catalog data.buyNum data.city data.property data.province data.shopId data.shopName data.discount data.buyCount data.status data.webSiteId data.freePost
0 200 查询商品信息成功! 0 2021-05-11 11:17:23 2021-05-11 11:17:23 True 130 oppo A9 https://img.simoniu.com/good_56.jpg 0.1 0 手机 0 广州 None 广东 100 None 0 0 0 2 False
对于更复杂的json格式的解析,如下:
import pandas as pd
import json
import requests
url = "https://www.simoniu.com/commons/items/catalog/图书"
json_str = requests.get(url=url)
data =json.loads(json_str.text)
df2 = pd.json_normalize(data,record_path =['data'], meta=['code', 'msg'])
print(df2.to_string())
运行效果如下:
version createTime modifyTime flag id name pic price number catalog buyNum city property province shopId shopName discount buyCount status webSiteId freePost code msg
0 0 2021-05-11 11:18:26 2021-05-11 11:18:26 True 132 Java编程思想第4版 https://img.simoniu.com/good_57.jpg 0.1 300 图书 0 北京 None 北京 100 None 0 0 0 2 False 200 查询商品列表成功!
1 0 2021-05-11 11:18:26 2021-05-11 11:18:26 True 133 Java核心技术第二版 https://img.simoniu.com/good_58.jpg 0.1 400 图书 0 北京 None 北京 100 None 0 0 0 2 False 200 查询商品列表成功!
2 0 2021-05-11 11:18:26 2021-05-11 11:18:26 True 136 大话设计模式 https://img.simoniu.com/good_61.jpg 0.1 200 图书 0 天津 None 天津 100 None 0 0 0 2 False 200 查询商品列表成功!
分别设计Plate和PlateRecResutl类。
由于是自定义的类型,必须要为每个类设计Json序列化工具类仅仅需要继承自json.JSONEncoder。
import json
#自定义Plate的JSON序列化编码器
class PlateEncoder(json.JSONEncoder):
def default(self, obj):
return obj.__dict__
class Plate:
# 构造方法
def __init__(self, plateno, region):
self.plateno = plateno
self.region = region
def __str__(self):
return "车牌号码:%s ,归属地:%s" % (self.plateno, self.region)
#自定义PlateDectedResult的JSON序列化编码器
class PlateDectedResultEncoder(json.JSONEncoder):
def default(self, obj):
return obj.__dict__
class PlateDectedResult:
number = None
list = []
# 构造方法
def __init__(self, code,msg):
self.msg = msg
self.code = code
# toString()方法
def __str__(self):
result = "检测到车牌数量:%d " % (self.number)
result += "\n"
for plate in self.list:
result += str(plate) + "\n"
return result
测试类。
from domain.PlateRecResult import PlateDectedResult
from domain.PlateRecResult import Plate
from domain.PlateRecResult import PlateDectedResultEncoder
import json
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
p1 = Plate("陕ANIM77","陕西省西安市")
p2 = Plate("陕UK98A9","陕西省西安市")
list = []
list.append(p1)
list.append(p2)
result = PlateDectedResult(200,"检测成功!")
result.list = list
result.number = len(list)
print("--------------json对象转json字符串---------------------")
dic_p1 = p1.__dict__
p1JsonStr = json.dumps(dic_p1,ensure_ascii=False)
print(p1JsonStr)
dic_result = result.__dict__
resultJsonStr = json.dumps(dic_result,ensure_ascii=False,cls=PlateDectedResultEncoder)
print(resultJsonStr)
print("--------------json字符串转json对象---------------------")
jsonStr='{"msg": "检测成功!", "code": 200, "list": [{"plateno": "陕ANIM77", "region": "陕西省西安市"}, {"plateno": "陕UK98A9", "region": "陕西省西安市"}], "number": 2}'
jsonObj = json.loads(jsonStr)
print(jsonObj['msg'])
print(jsonObj['code'])
print(jsonObj['number'])
print(jsonObj['list'])
运行结果:
--------------json对象转json字符串---------------------
{"plateno": "陕ANIM77", "region": "陕西省西安市"}
{"msg": "检测成功!", "code": 200, "list": [{"plateno": "陕ANIM77", "region": "陕西省西安市"}, {"plateno": "陕UK98A9", "region": "陕西省西安市"}], "number": 2}
--------------json字符串转json对象---------------------
检测成功!
200
2
[{'plateno': '陕ANIM77', 'region': '陕西省西安市'}, {'plateno': '陕UK98A9', 'region': '陕西省西安市'}]