Python 无法返回“文件”;“有效”;来自已解析字典的字段
我有以下格式的json:Python 无法返回“文件”;“有效”;来自已解析字典的字段,python,json,Python,Json,我有以下格式的json: myDict = { "Garden": { "GroundFloor": { "@loc": "porch", "@myID": "35C", "Tid": "1", "InfoList": { "status": { "@default": "0", "@myID": "20C" }, "count": {
myDict =
{
"Garden": {
"GroundFloor": {
"@loc": "porch",
"@myID": "35C",
"Tid": "1",
"InfoList": {
"status": {
"@default": "0",
"@myID": "20C"
},
"count": {
"@default": "0",
"@myID": "1"
}
}
},
"TopFloor": {
"@loc": "backyard",
"@myID": "35C",
"Tid": "2",
"InfoList": {
"status": {
"@default": "0",
"@myID": "20D"
},
"count": {
"@default": "0",
"@myID": "2"
}
}
}
},
"BackYard": {
"GroundFloor": {
"@loc": "porch",
"@myID": "35C",
"Tid": "3",
"InfoList": {
"status": {
"@default": "0",
"@myID": "20C"
},
"count": {
"@default": "0",
"@myID": "1"
}
}
},
"TopFloor": {
"@loc": "backyard",
"@myID": "35C",
"Tid": "4",
"InfoList": {
"status": {
"@default": "0",
"@myID": "20D"
},
"count": {
"@default": "0",
"@myID": "2"
}
}
}
},
... many more nested layers...
}
我将其存储到字典中,需要对其执行一些处理
对于给定的“Tid”,我希望能够在“状态”部分返回“@default”值。例如,如果我请求“Tid”=1,我应该得到以下输出
预期产出:
{ "Tid": "1",
"status": "0" -->this is the value from the @default attribute
}
# note that the "status" value is the attribute @default.
我现在有下面的方法,但它返回我这个,我不明白为什么
{ "Tid": null,
"status": null
}
我的方法:
def get_system_state(myDict, id):
for i in ["id", "@default"]:
print (myDict.get(i))
if any(c == id_type for c in myDict.values()):
yield {i: myDict.get(i) for i in ["id", "@default"]}
else:
for i in myDict.values():
if isinstance(i, dict):
yield from get_system_state(i, id_type)
任何帮助都将不胜感激。我只需更改您的字典
“Tid”:“2”,“InfoList”:{“status”:{“@default”:“1”,“@myID”:“20D”},
@default值以供测试之用
- 如果字符串中的所有字符都是数字,则方法返回“True”,否则返回“False”
myDict ={
"Garden": {
"GroundFloor": {
"@loc": "porch",
"@myID": "35C",
"Tid": "1",
"InfoList": {"status": { "@default": "0","@myID": "20C"},
"count": {"@default": "0","@myID": "1"}
}
},
"TopFloor": {
"@loc": "backyard",
"@myID": "35C",
"Tid": "2",
"InfoList": { "status": { "@default": "1","@myID": "20D"},
"count": {"@default": "0","@myID": "2" }
}
}
}
}
def get_system_state(myDict, id):
for k,v in myDict['Garden'].items():
for x in v:
if 'Tid' in v and v['Tid'] is not None and v['Tid'].isdigit() and int(v['Tid']) == id:
return [{'Tid':id,'status':v['InfoList']['status']['@default']}]
new_dict = get_system_state(myDict, 1)
print(new_dict)
O/p:
[{'Tid': 1, 'status': '0'}]
[{'Tid': 2, 'status': '1'}]
如果您通过id=2
new_dict = get_system_state(myDict, 2)
O/p:
[{'Tid': 1, 'status': '0'}]
[{'Tid': 2, 'status': '1'}]
更新:
[{'Tid': 1, 'status': '0'}]
[{'Tid': 2, 'status': '1'}]
如果一本字典没有“花园”作为顶级字典
def get_system_state(myDict, id):
for k1,v1 in myDict.items():
for k,v in v1.items():
for x in v:
if 'Tid' in v and v['Tid'] is not None and v['Tid'].isdigit() and int(v['Tid']) == id:
return [{'Tid':id,'status':v['InfoList']['status']['@default']}]
尝试使用以下方法:
def get_system_state(myDict, id):
garden_details = myDict.get("Garden", None)
if garden_details:
for floor in garden_details:
Tid = garden_details[floor].get(str("Tid"), None)
if Tid == str(id):
return {'Tid': Tid, 'status': garden_details[floor]['InfoList']['status']['@default']}
检查这是否适合您。您可以使用简单递归:
data = {'Garden': {'GroundFloor': {'@loc': 'porch', '@myID': '35C', 'Tid': '1', 'InfoList': {'status': {'@default': '0', '@myID': '20C'}, 'count': {'@default': '0', '@myID': '1'}}}, 'TopFloor': {'@loc': 'backyard', '@myID': '35C', 'Tid': '2', 'InfoList': {'status': {'@default': '0', '@myID': '20D'}, 'count': {'@default': '0', '@myID': '2'}}}}, 'BackYard': {'GroundFloor': {'@loc': 'porch', '@myID': '35C', 'Tid': '3', 'InfoList': {'status': {'@default': '0', '@myID': '20C'}, 'count': {'@default': '0', '@myID': '1'}}}, 'TopFloor': {'@loc': 'backyard', '@myID': '35C', 'Tid': '4', 'InfoList': {'status': {'@default': '0', '@myID': '20D'}, 'count': {'@default': '0', '@myID': '2'}}}}}
def get_id(d, id):
if isinstance(d, dict) and d.get('Tid') == id:
yield {'Tid':d['Tid'], 'status':d['InfoList']['status']['@default']}
for i in getattr(d, 'values', lambda :[])():
yield from get_id(i, id)
print(list(get_id(data, '1')))
输出:
[{'Tid': '1', 'status': '0'}]
TopFloor“
您错过了指向此网站并验证json的引号-@Nitin验证并更新了它。@LauraSmith让我检查一下为什么会发生这种情况。将恢复到u@LauraSmith你期望的结果是什么?例如,如果字典没有“花园”的话“字符串作为顶级节点,我如何使其在任何情况下都通用?我更新了问题中的myDict以反映我的意思。@LauraSmith现在试一试。最后一个问题是,是否可以返回{'Tid':id,'status':v['InfoList']['status']['@default']}”
返回一个列表?@LauraSmith表示我没有收到任何错误。答案更新我想让它更通用,而不是使用字符串“Garden”。我更新myDict来显示这一点。Garden\u details=list(myDict.values())[0]
如果位置固定,请使用这个而不是Garden\u details=myDict.get(“Garden”,None)
。