python json嵌套字典和列表解码

时间:2015-05-22 03:06:58

标签: python json

我正在尝试解析API调用的输出,这是一个带有嵌套字典和列表的json对象,深度未知。我看到了几个递归函数的例子,它从嵌套的list / dict中获取一个键值,但我想获得特定的顺序以及结构的正确性。例如:

    response = {'a': {'b': {'b1': 1, 'b2': 2},
                'c': [{'c1': 3,'c2': [{'x':55,'y':56},{'x':65,'y':66}]},
                      {'c1': 5,'c2': [{'x':75,'y':76},{'x':85,'y':86}]}]
                   }
                 }

fun(response,"a-c-c2-x") should return [55,65,75,85]
fun(response,"a-b-b2") should return [2]
fun(response,"a-b2-b") should return []

到目前为止我所做的不起作用:)

def get_response_values(response=None, key=None, result=None):
    print("1-r: {} - key: {} -r:{}".format(response, key, result))
    if result is None:
        result = []

    if '-' in key:
        if isinstance(response, dict):
            index = key.find('-')
            response = response[key[:index]]
            key = key[index+1:]
            print("3-r: {} - key: {} -r:{}".format(response, key, result))
            get_response_values(response, key, result)

        if isinstance(response, list):
            index = key.find('-')
            key = key[index+1:]
            for item in response:
                print("4-r: {} - key: {} -r:{}".format(item, key, result))
                get_response_values(item, key, result)

    else:
        try:
            result.append(response[key])
            print("2-r: {} - key: {} -r:{}".format(response, key, result))
            return result
        except:
            print("5-r: {} - key: {} -r:{}".format(response, key, result))
            return result


    return result

1 个答案:

答案 0 :(得分:1)

您可以使用像jsonselect这样的库来实现JSON Select查询规范语言。

基本程序示例:

from jsonselect import select

result = select(query, data)

更新:或者看起来您也可以使用funcy的funcy.get_in()功能。

不要重新发明轮子;有许多好的即用型解决方案。

更新#2:鉴于以下您的评论是一个更简单的理解和阅读示例,它可以让您80%的方式(不使用递归,冒着吹的风险堆栈!):

def query(data, path):
    elem = data
    try:
        for x in path.strip("/").split("/"):
            elem = elem.get(x)
    except:
        pass

    return elem