如何基于文本值的存在拆分JSON对象?

2024-10-01 07:23:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Python中的requests模块从restapi中提取信息。数据以JSON格式返回—JSON数组的每个元素表示一个用户,groups子数组表示其Active Directory组。示例条目如下所示:

{
                    "id": 0101010101,
                    "createdAt": 111111,
                    "displayName": "Jones, Steve",
                    "firstName": "Steve",
                    "lastName": "Jones",
                    "groups": [
                        "All Users",
                        "Anyville Users (WIN10)",
                        "Windows 10 Users"
                    ],
                    "deviceCount": 0
                },
{
                    "id": 0101010102,
                    "createdAt": 111111,
                    "displayName": "Smith, Dave",
                    "firstName": "Dave",
                    "lastName": "Smith",
                    "groups": [
                        "All Users",
                        "Faketown Users (WIN7)",
                        "Windows 7 Users"
                    ],
                    "deviceCount": 0
                }

如何遍历JSON数组,评估groups数组是否包含与一组位置(Anyville、Faketown、noweherland)中的任何一个匹配的文本,并将该行放入每个位置的单独对象中?最接近我的是:

faketownUsers = {}
response = requests.request("GET", url, headers=headers)

ir = json.loads(response.text)
data = ir['result']['searchResults']
for row in data:
    if "Faketown" in str(row):
        faketownUsers.extend(row)

Tags: idjson数组allfirstnamerequestsusersrow
3条回答

我会这样做:

# load data, raise an exception on error
res = requests.get(url, headers=headers)
res.raise_for_status()

# get data from json response
data = res.json()['result']['searchResults']

# figure out which user groups match
locations = {'Faketown': [], 'Anyville': []}
for row in data:
    for locname, locarr in locations.items():
        if any(locname in grp for grp in row['groups']):
            locarr.append(row)

为了更好地检查/处理错误,我修改了一些其他代码,主要是抛出异常

您可以将对象转换为字符串来检查它是否包含子字符串,而不是将其检查到每个字段中。你知道吗

from collections import defaultdict
locations = defaultdict([])

locations_to_check = ['Anyville', 'Faketown', 'Nowehereland']
for row in data:
    for location in locations_to_check:
         if location in str(row['groups']):
            locations[location].append(row)

# output
# {'Anyville': [{...}, {...}], 'Faketown': [{...},{...}]}

您的row表示完整的字典,但是您需要查看groups项的内部。 groupslist,您要查找的字符串是该list项的一部分。 有很多方法,我举两个例子,方法一:

locations = {'Faketown': []}
for row in data:
    for group in row['groups']:
        if 'Faketown' in group:
            locations['Faketown'].append(row)

方法2:

locations = {'Faketown': []}
for row in data:
    if 'Faketown' in ''.join(row['groups']):
        locations['Faketown'].append(row)

您可以将任何其他位置添加到locations。你知道吗

相关问题 更多 >