Reputation: 664
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
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
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
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
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
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