talkdatatome
talkdatatome

Reputation: 664

Extracting Json Value from path python

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"]

Upvotes: 3

Views: 5561

Answers (5)

rockikz
rockikz

Reputation: 646

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]

Upvotes: 0

Narendra Prasath
Narendra Prasath

Reputation: 1531

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

Upvotes: 1

Ashish
Ashish

Reputation: 643

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

Upvotes: 0

Rakesh
Rakesh

Reputation: 82755

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))

Upvotes: 5

tomer.z
tomer.z

Reputation: 1063

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

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

Upvotes: 1

Related Questions