使用条件循环 JSON 对象

Looping through JSON object with a conditional

循环遍历此 json 对象 content 时遇到一些困难。 json 文件是这样的:

[{'archived': False,
  'cache_ttl': None,
  'collection': {'archived': False,
   'authority_level': None,
   'color': '#509EE3',
   'description': None,
   'id': 525,
   'location': '/450/',
   'name': 'eaf',
   'namespace': None,
   'personal_owner_id': None,
   'slug': 'eaf'},
  'collection_id': 525,
  'collection_position': None,
  'created_at': '2022-01-06T20:51:17.06376Z',
  'creator_id': 1,
  'database_id': 4,
  }, ... ]

我想遍历列表中的每个字典,检查集合是否为空,然后如果位置等于 '/450/' return,则为每个集合将该字典附加到列表中。

我的代码如下

content = json.loads(res.text)
for q in content:
  if q['collection']:
    for col in q['collection']:
      if col['location'] == '/450/':
        data.append(q)
  
print(data) 

玩过之后,我要么得到 ValueError: too many values to unpack (expected 2) 要么 TypeError: string indices must be integers 如果对我的结构有任何帮助,将不胜感激。

免责声明: 我之前将其写为列表理解,它的工作原理非常棒,但它不再起作用,因为我现在需要检查 collection 是否为空。 我之前是怎么写的:

content = [ x for x in content if x['collection']['location'] == '/450/']

根据您之前的列表理解,"location"q["collection"] 中的一个键。 当你写

for col in q["collection"]

您正在迭代 q["collection"] 中的键。其中一个键是 "location"。您的 for 循环似乎重复了不必要的次数:

if q['collection'] and "location" in q["collection"] and q["collection"]["location"]  == "/450/":
    data.append(q)

这应该适合你:

for q in content:
    if q['collection']['location'] == '/450/':
        data.append(q)
  
print(data)

如果您使用 for 循环和 for col in q['collection'],您只需迭代 q['collection'] 中的键,所以 cols = ['archived', 'authority_level', ...].

不需要遍历 collection 对象,因为它是一个字典,只需要检查位置 属性.

此外,如果“collection”或“location”属性不存在,则使用 dict.get(key) 函数而不是 dict[key],因为如果 key 不存在,后者将引发 KeyError 异常found 和 get() returns None 如果没有找到键值。

content = [{'archived': False,
        'cache_ttl': None,
        'collection': {'archived': False,
                       'authority_level': None,
                       'color': '#509EE3',
                       'description': None,
                       'id': 525,
                       'location': '/450/',
                       'name': 'eaf',
                       'namespace': None,
                       'personal_owner_id': None,
                       'slug': 'eaf'},
        'collection_id': 525,
        'collection_position': None,
        'created_at': '2022-01-06T20:51:17.06376Z',
        'creator_id': 1,
        'database_id': 4,
        },
       {'foo': None}
       ]

#content = json.loads(res.text)
data = []
for q in content:
    c = q.get('collection')
    if c and c.get('location') == '/450/':
        data.append(q)
  
print(data)

输出:

[{'archived': False, 'cache_ttl': None, 'collection': { 'location': '/450/', 'name': 'eaf', 'namespace': None }, ...}]

您的 代码迭代次数太多 超出需要。

检查col['location'] = "/450/时,第第二个条件语句出现错误TypeError: string indices must be integers ".

那是因为集合对象中并非所有代币都有sub-objects在那里你可以用他们的键获取数据。

看看你的旧代码修改后的代码更深入的了解。

# Your old json datas
content  = [{'archived': False,
  'cache_ttl': None,
  'collection': {'archived': False,
   'authority_level': None,
   'color': '#509EE3',
   'description': None,
   'id': 525,
   'location': '/450/',
   'name': 'eaf',
   'namespace': None,
   'personal_owner_id': None,
   'slug': 'eaf'},
  'collection_id': 525,
  'collection_position': None,
  'created_at': '2022-01-06T20:51:17.06376Z',
  'creator_id': 1,
  'database_id': 4,
  } ]

data = []
for q in content:
    if q['collection']:
        for col in q['collection']: 
            if col['location'] == '/450/': # The first object in collection object is [archived] which is a string, this causes the program to throw error
                data.append(q)
  
print(data) 

这里是修改后的代码

# Your json datas
json_datas = [{'archived': False,
  'cache_ttl': None,
  'collection': {'archived': False,
   'authority_level': None,
   'color': '#509EE3',
   'description': None,
   'id': 525,
   'location': '/450/',
   'name': 'eaf',
   'namespace': None,
   'personal_owner_id': None,
   'slug': 'eaf'},
  'collection_id': 525,
  'collection_position': None,
  'created_at': '2022-01-06T20:51:17.06376Z',
  'creator_id': 1,
  'database_id': 4,
  } ]


list_data = [] # Your list data in which appends the json data if the location is /450/

for data in json_datas: # Getting each Json data
  if len(data["collection"]): # Continue if the length of collection is not 0 [NOTE: 0 = False, 1 or more = True]
    if data['collection']['location'] == "/450/": # Check the location
      list_data.append(data) # Append if true


print(list_data)