3

I have a sample Json which contains key as fileName and value as filepath. For example:

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

and I have a function which takes key as input and return value as output. Something like this:

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

If the key is available as a root element then my functions totally works but if the key is available in nested format just like it is available in the json then my function will fail.

I will call the function with the json path something like this:

readFilePath("sqlFiles.sqlQueryPath")

What changes to be made in the function that it parse the path in the format config["sqlFiles"]["sqlQueryPath"]

2

5 Answers 5

5

This is one approach. Using a simple iteration.

Demo:

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))
Sign up to request clarification or add additional context in comments.

Comments

1

You need to split the key by '.' and read value iteratively, pesudo code:

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

Comments

1

You could try this out,

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

Comments

0

You can try this by splitting the input and avoiding for loop with root key

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

Comments

0

Here is a solution:

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]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.