Reputation: 1179
I'm trying to logically traverse a JSON in Python and return the path of any String value that equals a value. I'm trying to traverse it recursively, but if multiple elements match the comparison, it only returns he first:
test_json = {
"a": {
"b": {
"c": {
"d": "foo"
}
}
},
"1": {
"2": {
"3": "bar"
}
},
"a1" : "foo"
}
def searchDict(d, path):
for k,v in d.iteritems():
if isinstance(v, dict):
path.append(k)
return searchDict(v, path)
else:
if v == "foo":
path.append(k)
path.append(v)
return path
print searchDict(test_json, [])
I want this to have the capacity to return something like:
a -> b -> c -> d -> foo
a1 -> foo
But instead it only iterates through the first sub-dictionary:
['a', 'b', 'c', 'd', 'foo']
This is probably easier than I'm making it, just having trouble logically solving it. Any ideas?
Upvotes: 3
Views: 1868
Reputation: 111
I wanted to add my answer inspired from Martin Gottweis's
answer.
Some logic was added to handle nested lists too:
def searchDict(d, path=[], sPath=[]):
if isinstance(d, dict):
for k,v in d.items():
if v == "foo":
sPath.append(path)
searchDict(v, path + [k])
elif isinstance(d, list):
for i, obj in enumerate(d):
searchDict(obj, path + [i])
return sPath
Upvotes: 1
Reputation: 2739
What a good question. You are actually two tiny bits away from solving it yourself.
check out my modified working code. tried to make as little changes into your code so it's easy to understand.
test_json = {
"a": {
"b": {
"c": {
"d": "foo"
}
}
},
"1": {
"2": {
"3": "bar"
}
},
"a1" : "foo"
}
def searchDict(d, path):
for k,v in d.iteritems():
if isinstance(v, dict):
searchDict(v, path + [k])
else:
if v == "foo":
print(path + [k] + [v])
searchDict(test_json, [])
Upvotes: 3
Reputation: 19
A couple of observations, and maybe hints:
Good luck!
Upvotes: 1