前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python解析复杂的json

python解析复杂的json

作者头像
雷子
发布2021-03-15 15:41:07
2K0
发布2021-03-15 15:41:07
举报
文章被收录于专栏:雷子说测试开发

我们在接口测试,还是python开发的过程中,都会遇到复杂json的解析的,但是怎么去解析这些复杂的json呢。其实也是一个技术活,用jsonpath是可以,但是有的时候,我们又不能取用jsonpath来解析,那么这个时候怎么办,怎么去解决这个问题呢,其实答案还是很简单的,怎么解决呢,那就是自己去封装一个方法去解析这个json呢。

那么我们的思路是什么的,首先呢,我们是要解析复杂的json,我们先把json加载下,变成复杂的dict,变成dict,我们知道每个dict都是有key-value形式构成,那么我们去解析每一个key的value,我们拿到value去判断value是否可以再次拆解撑key-value格式的,然后在继续去读取这个复杂的value。层层去抓取,用递归的方式去解决这个问题。最后去把取到的和预期的值去增加到一个list里面,最后去解析这个value就可以,那么我们看看代码是怎么实现的。

代码语言:javascript
复制
def get_dict_value(d, co_de):
    result = []
    if isinstance(d, dict):
        try:
            value = d[co_de]
            result.append(value)
        except Exception as e:
            pass
        for valuedd in d.values():
            if isinstance(valuedd, dict):
                yied_result = getdictvalue(valuedd, co_de)
                if len(yied_result) != 0:
                    result.append(getdictvalue(valuedd, co_de))
            elif isinstance(valuedd, (list, tuple)):
                for item in d:
                    valueitem = getdictvalue(item, co_de)
                    if valueitem != "None" and valueitem is not None and len(valueitem) != 0:
                        if valueitem not in result:
                            result.append(valueitem)
            elif isinstance(valuedd,str):
                try:
                    resultd = eval(valuedd)
                    for item in resultd:
                        value = getdictvalue(item, co_de)
                        if value != "None" and value is not None and len(value) != 0:
                            if value not in result:
                                result.append(value)
                except:
                    pass
        gc.collect()

    elif isinstance(d, (list, tuple)):
        for item in d:
            value = get_dict_value(item, co_de)
            if value != "None" and value is not None and len(value) != 0:
                if value not in result:
                    result.append(value)
        gc.collect()
    else:
        try:
            d=eval(d)
            for item in d:
                value = get_dict_value(item, co_de)
                if value != "None" and value is not None and len(value) != 0:
                    if value not in result:
                        result.append(value)
            gc.collect()
        except:
            pass
    return result

解析后,返回了一个复杂的list,我们需要对这个复杂的list做处理。怎么处理呢,思路就是把层层返回的list迭代读取出来,组成新的list即可。

代码语言:javascript
复制
class listchangetype(object):
    """对于查找后的list的数据的清洗"""

    def __init__(self):
        self.arg = []

    def make(self, listone):
        for i in listone:
            if isinstance(i, (type, list)):
                for l in i:
                    self.make(i)
            else:
                if i not in self.arg:
                    self.arg.append(i)
        gc.collect()
        return self.arg

这样,我们就封装好了一个解析复杂json的,我们可以去试试,找一个json串。这里我省略了json.loads()这个步骤。直接去读取转换后的dict,我们看下结果

代码语言:javascript
复制
dicttwo={'code': 0, 'msg': 'success'}
print(getdictvalue(dicttwo,"msg"))

运行结果:

有人说你这个是简单的dict,复杂的怎么办,我们在来试试。

代码语言:javascript
复制
dicttwo={'code': 0, 'msg': 'success', 'errors': None, 'data': [{'id': 0,},{"id":1}]}
print(getdictvalue(dicttwo,"id"))

返回结果:

这个就是我们要封装上面list解析的原因,每次迭代返回的格式不一样。

代码语言:javascript
复制
listone=listchangetype()
dicttwo={'code': 0, 'msg': 'success', 'errors': None, 'data': [{'id': 0,},{"id":1}]}
result=getdictvalue(dicttwo,"id")
print(listone.make(result))

结果:

这样,我们就简单了封装了一个复杂的json的解析。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档