亲宝软件园·资讯

展开

python解析json字段

H.S.T不想卷 人气:0

1、运用re、json、jsonpath包解析json思路

(1)re:正则表达式,通过json的形式对症下药,写表达式去解析json;

(2)json: 通过json中的json.loads()方法,将str类型转为dict类型,运用python字典的数据结构特点去解析json;

(3)jsonpath:对比与json包,jsonpath可以根据路径去解析json,比较适合用来解析json中带“[ ]”的数据。

2、三种方式的json解析案例

#json数据样式,本文采用带[]的数据样式
{
    "version": "version 1.0.12",
    "result": {
        "pages": 1314,
        "data": [
            {
                "name": "大明",
                "IDcard": "440588190001015688",
                "address": "广东省广州市天河区正佳广场99楼520号",
            },
            {
                "name": "二明",
                "IDcard": "440588190012317456",
                "address": "广东省广州市天河区天环广场88楼520号",
            }
        ]
    }
}

(1)运用re正则表达式解析json

import re
jsondata={
    "version": "23231cimesfedkk",
    "result": {
        "pages": 1314,
        "data": [
            {
                "name": "大明",
                "IDcard": "440588190001015688",
                "address": "广东省广州市天河区正佳广场99楼520号",
            },
            {
                "name": "二明",
                "IDcard": "440588190012317456",
                "address": "广东省广州市天河区天环广场88楼520号",
            }
        ]
    }
}

if __name__ == '__main__':
    name_list=re.findall(r"'name': '(\w*)'",str(jsondata))
    IDcard_list=re.findall(r"'IDcard': '(\w{18})'", str(jsondata))#SFZ18位数字和字母组合
    address_list=re.findall(r"'address': '(\w*)'", str(jsondata))#地址
    print(name_list)
    print(IDcard_list)
    print(address_list)

运行结果:

['大明', '二明']
['440588190001015688', '440588190012317456']
['广东省广州市天河区正佳广场99楼520号', '广东省广州市天河区天环广场88楼520号']

(2)运用字典的数据结构性质解析json

import json
jsondata={"version": "23231cimesfedkk","result": {"pages": 1314,"data": [{"name": "大明","IDcard": "440588190001015688","address": "广东省广州市天河区正佳广场99楼520号",},{"name": "二明","IDcard": "440588190012317456","address": "广东省广州市天河区天环广场88楼520号",}]}}
if __name__ == '__main__':
    # 若传入的数据为str类型需要将它转成dict类型
    # result = json.loads(jsondata)
    jsondata = jsondata["result"]["data"]
    resultdata = jsondata
    namelist=[]
    idcardlist=[]
    addresslist=[]
    for data in resultdata:
        namelist.append(data['name'])
        idcardlist.append(data['IDcard'])
        addresslist.append(data['address'])
    print(namelist)
    print(idcardlist)
    print(addresslist)

运行结果:

['大明', '二明']
['440588190001015688', '440588190012317456']
['广东省广州市天河区正佳广场99楼520号', '广东省广州市天河区天环广场88楼520号']

(3)运用jsonpath的路径解析json

import jsonpath

jsondata={"version": "23231cimesfedkk","result": {"pages": 1314,"data": [{"name": "大明","IDcard": "440588190001015688","address": "广东省广州市天河区正佳广场99楼520号",},{"name": "二明","IDcard": "440588190012317456","address": "广东省广州市天河区天环广场88楼520号",}]}}
if __name__ == '__main__':
    namelist=[]
    idcardlist=[]
    addresslist=[]
    #运用jsonpath.jsonpath(字典数据, 路径)
    namelist=jsonpath.jsonpath(jsondata, '$..name')
    idcardlist=jsonpath.jsonpath(jsondata, '$..IDcard')
    addresslist=jsonpath.jsonpath(jsondata, '$..address')
    print(namelist)
    print(idcardlist)
    print(addresslist)

运行结果:

['大明', '二明']
['440588190001015688', '440588190012317456']
['广东省广州市天河区正佳广场99楼520号', '广东省广州市天河区天环广场88楼520号']

3、附录:re正则表达式语法

附:python 处理非标准 json 格式字符串

在写爬虫的时候,会发现很多数据都是通过 json 格式进行传输的,标准的 json 我们可以将其转化为 Python 中的数据类型,进行查询,但对于一些类似于 json 但又非标准 json 格式的字符,就会比较头疼了,这里统计一些咱遇到的非标准的 json 格式,及相应的解析方法。

字符串中 key 的值没有被单引号包裹

类似于这种字符,看上去格式和 json 很像(眼尖的朋友可能发现了,这是 qq 的数据 嘿嘿),但仔细观察会发现,这其中的 key 没有被单引号包裹起来,这就导致了它无法被简单的解析为字典类型,因为解析的时候 key 会被解析成相应的变量而非字符,这些变量又都没有定义,所以会报错。

那怎么办呢?咱的第一反应是利用正则去人为构造成标准的格式,不过这个难度系数有点大,对正则的要求挺高,还费脑子,明显不符合咱的风格。于是咱就去网上找了一下,有没有现成的方法,还真有呢:

使用 demjson

首先安装 demjson

pip install demjson
s = '{suggestion:[{query:"London",interpretation: \'abc\'}]}'
dict1 = demjson.decode(s)
print(dict1)
{'suggestion': [{'interpretation': 'abc', 'query': 'London'}]}

总结

加载全部内容

相关教程
猜你喜欢
用户评论