json list格式_python解析复杂的json

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

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

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即可。

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,我们看下结果        

dicttwo={'code': 0, 'msg': 'success'}print(getdictvalue(dicttwo,"msg"))

    运行结果:

c6466c6b677eccd2a1d0ccad8d019957.png

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

dicttwo={'code': 0, 'msg': 'success', 'errors': None, 'data': [{'id': 0,},{"id":1}]}print(getdictvalue(dicttwo,"id"))

        返回结果:

fc69b9b1baf9e0b07a2226594e6e4cdc.png

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

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

   结果:

5f290ecfc8f1e816b6b8b42879b8e512.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值