Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法返回“文件”;“有效”;来自已解析字典的字段_Python_Json - Fatal编程技术网

Python 无法返回“文件”;“有效”;来自已解析字典的字段

Python 无法返回“文件”;“有效”;来自已解析字典的字段,python,json,Python,Json,我有以下格式的json: myDict = { "Garden": { "GroundFloor": { "@loc": "porch", "@myID": "35C", "Tid": "1", "InfoList": { "status": { "@default": "0", "@myID": "20C" }, "count": {

我有以下格式的json:

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”
Ex.

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)