从路径python提取Json值

时间:2018-09-24 11:06:27

标签: python json

我有一个示例Json,其中包含密钥作为fileName和值作为filepath。例如:

{
  "sqlFiles":{
    "sqlQueryPath": "tmp/r/test.sql"
  },
  "csvFiles": {
    "firstSampleInput": "tmp/c/sample.csv",
    "secondSampleInput": "tmp/c/sample1.csv"
  }
}

,我有一个函数,将键作为输入,将返回值作为输出。像这样:

def readFilePath(key):
    with open('filePaths.json', 'r') as f:
        config = json.load(f)
        value = config[key]
        return value

如果密钥可以作为根元素使用,那么我的函数完全可以使用,但是如果密钥可以嵌套格式使用(就像json中可用),那么我的函数将失败。

我将使用json路径调用该函数,如下所示:

readFilePath("sqlFiles.sqlQueryPath")

解析格式为config["sqlFiles"]["sqlQueryPath"]的路径的函数需要进行哪些更改

5 个答案:

答案 0 :(得分:2)

这是一种方法。使用简单的迭代。

演示:

key = "sqlFiles.sqlQueryPath"

def readFilePath(key):
    config = {
          "sqlFiles":{
            "sqlQueryPath": "tmp/r/test.sql"
          },
          "csvFiles": {
            "firstSampleInput": "tmp/c/sample.csv",
            "secondSampleInput": "tmp/c/sample1.csv"
          }
        }

    for i in key.split("."):
        if i in config:
            config = config[i]
        else:
            return None


    return config

print(readFilePath(key))

答案 1 :(得分:1)

您需要用“。”分隔键。并迭代伪代码读取值:

for nestedKey in key.split('.'): value = value[nestedKey]

答案 2 :(得分:0)

您可以尝试通过拆分输入并避免使用根键进行for循环

def readFilePath(key):
    json_keys = key.split('.')
    with open('filePaths.json', 'r') as f:
        config = json.load(f)
        if len(json_keys) > 1:
            value = config[json_keys[0]][json_keys[1]]
        else:
            value = config[json_keys[0]]
        return value

答案 3 :(得分:0)

您可以尝试一下,

def readFilePath(key):
with open('filePaths.json', 'r') as f:
    config = json.load(f)
    value = ""
    config_temp = config
    try:
        for k in key.split("."):
            config_temp = config_temp[k]
        value = config_temp
        return value
    except KeyError:
        return value

答案 4 :(得分:0)

这是一个解决方案:

def readFilePath(key):
    with open("sample.json") as f:
        config = json.load(f)
        value = None
        for k in key.split("."):
            try:
                value = config[k]
            except KeyError:
                config = value
        return value[k]