python 分享一个通过 (key1.key2.key3) 形式获取嵌套字典值的方法

Prince0813
Prince0813
Prince0813
订阅者
285
文章
0
评论
测试交流1 239字数 475阅读1分35秒阅读模式

最近在做接口自动化测试,响应的内容大多数是多层嵌套的 json 数据,如果一层层的去剥,效率不高,脚本繁重,所以写了一个可以通过(key1.key2.key3)形式获取嵌套字典值的方法,如有不对或者需要优化的地方欢迎指出。

def get_dict_value(date, keys, default=None):
#default=None,在key值不存在的情况下,返回None
    keys_list = keys.split('.')
#以“.”为间隔,将字符串分裂为多个字符串,其实字符串为字典的键,保存在列表keys_list里
    if isinstance(date,dict):
#如果传入的数据为字典
        dictionary = dict(date)
#初始化字典
        for i in keys_list:
#按照keys_list顺序循环键值
            try:
if dictionary.get(i) != None:
dict_values = dictionary.get(i)
#如果键对应的值不为空,返回对应的值
                elif dictionary.get(i) == None:
dict_values = dictionary.get(int(i))
#如果键对应的值为空,将字符串型的键转换为整数型,返回对应的值
            except:
return default
#如果字符串型的键转换整数型错误,返回None
            dictionary = dict_values
return dictionary
else:
#如果传入的数据为非字典
        try:
dictionary = dict(eval(date))
#如果传入的字符串数据格式为字典格式,转字典类型,不然返回None
            if isinstance(dictionary,dict):
for i in keys_list:
#按照keys_list顺序循环键值
                    try:
if dictionary.get(i) != None:
dict_values = dictionary.get(i)
#如果键对应的值不为空,返回对应的值
                        elif dictionary.get(i) == None:
dict_values = dictionary.get(int(i))
#如果键对应的值为空,将字符串型的键转换为整数型,返回对应的值
                    except:
return default
#如果字符串型的键转换整数型错误,返回None
                    dictionary = dict_values
return dictionary
except:
return default

运行结果:
一:字典类型数据。

python 分享一个通过 (key1.key2.key3) 形式获取嵌套字典值的方法插图
文章源自玩技e族-https://www.playezu.com/189048.html

二:字典类型数据,包含的键为数字。

python 分享一个通过 (key1.key2.key3) 形式获取嵌套字典值的方法插图1
文章源自玩技e族-https://www.playezu.com/189048.html

三:json 类型的字符串。

python 分享一个通过 (key1.key2.key3) 形式获取嵌套字典值的方法插图2
文章源自玩技e族-https://www.playezu.com/189048.html手机软件测试文章源自玩技e族-https://www.playezu.com/189048.html文章源自玩技e族-https://www.playezu.com/189048.html
 
    • 子凡
      子凡 9

      测试下这种 {“key”:[{“subkey”:”value”}]}有个朋友分享过这段代码,大家可以试试。
      class obj(object):
      def __init__(self, d):
      for a, b in d.items():
      if isinstance(b, (list, tuple)):
      setattr(self, a, [obj(x) if isinstance(x, dict) else x for x in b])
      else:
      setattr(self, a, obj(b) if isinstance(b, dict) else b)

      d = {‘a’:1, ‘b’:{‘c’:2}, ‘d’:[{‘e’:1}]}

      res = obj(d)
      print res.a
      print res.b.c
      print res.d[0].e
      python 的 json 模块不能搞这些事么?可以参考这个addict 原来还有这个库,实现起来好简单,非常感谢给力json 模块只用过来字符转字典,字典转字符,好像没看到有取值的感谢分享json 对象比字典对象复杂度高一点,接口测试里处理 json 可以这样做:

      json.loads() 方法可以将字符串转化成 json 对象,如果不方便转换的类型,比如数据库涉及的 date,timestamp 类型,也可以通过 json.JSONEncoder 自己定义转化。

      python 里 json 数据的取值也比较简单 ,基本就是 ob[key][index] 这样。

      楼主的例子
      ob = json.loads(data_a)
      print ob[“2”][“b”][“c”]

      不过,等等,发现一个令我惊恐的问题,楼主给的字符串,第一层的 key 是 1?这个符合 json 的规范?
      所以我刚试了一下,楼主的字符串用 json 模块 loads 不进,orz 我错了@xeon 楼主,请教个问题,我的接口要求传入的 json 串按顺序,否则接口不认。python 读取字典是随机的,那么 json 串里面的参数也是随机排列的,有没有什么好的方法 。json.dumps() 方法有个参数 sort_keys用 jsonpath 做更简单
      https://pypi.python.org/pypi/jsonpath/0.54这个只能按首字母排序 。而不是自定义顺序 是的,key 可能是字符,也可能是数字自定义顺序或许可以看下 OrderedDict?你参考一下

      如果是这种嵌套里面有多个相同的 key 呢,如下面的 second_key1 和 second_key2 呢?
      {
      ‘first_ke1’: ‘a’,
      ‘first_key2’: [{‘second_key1’: ‘b1’, ‘second_key2’: ‘c1’}, {‘second_key1’: ‘b2’, ‘second_key2’: ‘c2’}, {‘second_key1’: ‘b3’, ‘second_key2’: ‘c3’}]
      }帮了大忙了,太感谢!{“f”: 4, “a.b.c”: 1, “a.b.d”: 2, “a.e”: 3, “d.1″:”5”} ==可否实现转成==> {“a”:{“b”:{“c”:1, “d”:2}, “e”: 3}, “f”: 4, “d”:[None, 5]}

    匿名

    发表评论

    匿名网友
    确定

    拖动滑块以完成验证