我的方法接受两个属性和一个json
列表并返回相应的值。它按预期工作。
现在,我想添加功能,让它返回相应的值,而不管它的深度如何。
例如,现在它接受parent
和child
args并返回一个值(见下文):return jsonprops[parent][child]
。
是否可以让它接受任意数量的args并返回相应的值? return jsonprops[parent][child1][child2]....[childN]
?
我找到了一个将args
的变量号传递给方法的示例(下方),但我不确定如何构建return jsonprops[parent][child]
,因为它{&#39}。我必须在[]
中订购args。
所需的解决方案将返回return jsonprops[parent][child]
以及return jsonprops[parent][child1][child2][child3][child4]
将可变数量的args传递给方法:
def multipleArgs(*arg):
print "Called with", len(arg), "arguments:", arg
阅读json文件:
import json
def read_json(parent, child, jsonprops=[])
return jsonprops[parent][child]
exampleFile = json.loads(open(example.json).read())
childInfo = read_json('parentProps', 'childProp1', exampleFile)
print childInfo
示例json
{
"generalInfo": {
"name": "example",
"schemaVersion": "1.0",
"description": "metadata to be an example"
},
"parentProps": {
"childProp1": "hi 1",
"childProp2": "hi 2",
"childProp3": {
"newParent": [
{
"parent1": [
{
"grandChild1": "GC1",
"grandChild2": "GC2",
"grandChild3": "GC3"
},
{
"numberofKids": "5",
"grandChild4": "GC4",
"grandChild5": "GC5",
"grandChild6": "GC6"
}
],
"parent2": [
{
"numberofKids": "1",
"grandChild11": "GC11",
"grandChild12": "GC12",
"grandChild13": "GC13"
},
{
"grandChild14": "GC14",
"grandChild15": "GC15",
"grandChild16": "GC16"
}
]
}
]
}
}
}
答案 0 :(得分:0)
如何将jsonpath与objectpath模块一起使用:
In [22]: from objectpath import Tree
In [23]: j = """
...: {
...: "generalInfo": {
...: "name": "example",
...: "schemaVersion": "1.0",
...: "description": "metadata to be an example"
...: },
...: "parentProps": {
...: "childProp1": "hi 1",
...: "childProp2": "hi 2",
...: "childProp3": {
...: "newParent": [
...: {
...: "grandChild1": "GC1",
...: "grandChild2": "GC2",
...: "grandChild3": "GC3"
...: },
...: {
...: "grandChild4": "GC4",
...: "grandChild5": "GC5",
...: "grandChild6": "GC6"
...: }
...: ]
...: }
...: }
...: }"""
In [24]: j = json.loads(j)
In [25]: next(Tree(j).execute('$..{}..{}'.format('parentProps', 'childProp1')))
Out[25]: 'hi 1'
In [53]: next(Tree(j).execute('$..{}..{}'.format('newParent', 'grandChild5')))
Out[53]: 'GC5'
然后,您的函数将加载json并在objectpath(如果有)
的帮助下返回结果答案 1 :(得分:0)
要从数据结构中的任意深度访问值,您可能希望使用循环。这是一个简单的方法:
def get_value(data, *keys):
for key in keys:
data = data[key]
return data
您还可以使用reduce
函数执行的隐式循环(在Python 3中是functools
模块的一部分):
from functools import reduce # this line is only needed in Python 3
from operator import getitem
def get_value(*args): # data should be first argument, followed by any number of keys
return reduce(getitem, args)