我需要写下一种方法来从另一个嵌套字典中转换现有的嵌套字典值,但是这两个字典之间的映射位于另一个第三个字典中。
input_json = {
"s0" :
{
"s1" : {
"s1_f1":"s1_v1",
"s1_f2" : "s1_v2"
},
"s2": {
"s2_f1":"s2_v1",
"s2_f2" : "s2_v2",
"s2_f3" : {
"s3_f1":"s3_v1"
}
}
}
}
swagger_template = { "d0" :
{
"d1_f1":"d1_v1",
"d3_f1" :"d3_v1"
}
}
mapping = {
"d1_f1":"s1_f1",
"d3_f1" : "s3_f1"
}
def find_mapping_key(v):
return (mapping[v])
def find_input_value(k,input_json):
if k in input_json:
return input_json[k]
for v in input_json.values():
if isinstance(v, dict):
return find_input_value(k,v)
return None
def transform(swagger_template):
for k, v in swagger_template.items():
if isinstance(v, dict):
transform(v)
else:
print("{0} : {1}".format(k, v))
#find the mapping value for this key in mapping JSON
print(find_mapping_key(k))
mapping_key=find_mapping_key(k)
#find the value for that mapping key in input_json
print(find_input_value(mapping_key,input_json))
transform(swagger_template)
为一个映射提供正确的值,但为另一个映射返回NONE。
答案 0 :(得分:1)
在函数find_input_value
中,您没有通过递归正确传播输出。递归函数需要具有一致的返回值。您有2个returns
发送结果,有1个发送None
。这是一个对我有用的版本,即使我怀疑它可以简化。
def find_input_value(k,input_json):
if k in input_json:
val = input_json[k]
for v in input_json.values():
if 'val' in locals(): #check if val has been defined
if val is not None: #needs to be defined and not None
break # kill the loop cause found it
if isinstance(v, dict):
val = find_input_value(k,v)
return val if 'val' in locals() else None # if input_json is not dict return None
输出
d1_f1:d1_v1
s1_f1
s1_v1
d3_f1:d3_v1
s3_f1
s3_v1