← 返回首页
Python3基础教程(九十)
发表时间:2023-03-26 15:14:08
JSON

JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML。JSON 比 XML 更小、更快,更易解析。Pandas 可以很方便的处理 JSON 数据。

1.panda解析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  查询商品列表成功!

2.json解析综合案例

分别设计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': '陕西省西安市'}]