【问题标题】:How to make a JSON with custom fields如何使用自定义字段制作 JSON
【发布时间】:2020-06-06 05:28:42
【问题描述】:

我不太确定这是否可能,因为我无法找到任何确切的信息。我会尽力在下面解释我想做的事情。

所以我使用请求库从 API 中提取信息。一旦我有了这些数据,我就会使用正则表达式从 json 输出中查找特定信息的所有匹配项。

我的代码是:

for i in data['resources']:
        if 'id' in i and 'name' in i:
            b = i['name'], i['id']
            k = str(b)
            if  re.findall("'Server-Ownership-\w+', \w+", k):
                matchedOwners = re.findall("'Server-Ownership-\w+', \w+", k)[0]
                j = str(matchedOwners)
                print(j)

这段代码的输出给了我:

'Server-Ownership-A', 100
'Server-Ownership-B', 200
'Server-Ownership-C', 300
'Server-Ownership-D', 400
'Server-Ownership-E', 500
'Server-Ownership-F', 600
'Server-Ownership-G', 700
'Server-Ownership-H', 800

我想做的是以某种方式将每个服务器所有权行引用为自己的,以便我可以使用与它关联的末尾的 ID 来为每个服务器执行获取请求。我的问题是我无法确定调用任何这些数据的方法。我想也许我可以把它变成 json 并为“服务器所有权”部分创建一个“名称”字段,然后在最后为 ID 创建一个“id”字段。这是可能的还是有更好的方法来解决这个问题?

非常感谢任何帮助!

【问题讨论】:

  • 为什么要使用正则表达式而不是直接访问字典键?
  • if i['name'].startswith('Server-Ownership-'):
  • @barmar 这就是我在最初的获取请求中所做的。我的 for 循环开始的地方我引用了 id 键和 name 键。我需要正则表达式,因为我返回了很多不是我需要的数据。因此,通过使用正则表达式,我只能显示我需要的“服务器所有权”。另外,id 键和 name 键没有放在一起,所以我需要将它们并排排列以供相应的服务器使用

标签: python json regex request


【解决方案1】:

如果您不想更改到目前为止所写的内容。我对其进行了修改,以便您可以为服务器所有者提供字典。根据您的要求,matchedOwners 中的所有内容都将添加到字典中。

server_owners_dict=dict()

for i in data['resources']:
    if 'id' in i and 'name' in i:
        b = i['name'], i['id']
        k = str(b)
        if  re.findall("'Server-Ownership-\w+', \w+", k):
            matchedOwners = re.findall("'Server-Ownership-\w+', \w+", k)[0]
            j = str(matchedOwners).strip().split() # get rid of whitespace and split by comma
            server_owners_dict[j[0].replace('Server-Ownership-','')]=j[1]

【讨论】:

  • 现在这些服务器所有者可以更改。他们将始终以“服务器所有权-”开头。有什么办法可以像for循环一样自动检测名称然后打印ID?我的最终目标是将这些信息放入 excel 中。例如服务器所有者名称,然后是 id。
  • 您可以轻松地替换掉“Server-Ownership-”部分,就像我刚刚编辑到我的解决方案中一样。
  • 抱歉所有问题,我只是想更好地理解这一点以扩展我的知识。最后一行究竟是做什么来自动检测名称的?
  • 别担心!既然您解释了服务器所有者总是以“Server-Ownership-”开头,我们首先像您一样查找匹配“Server-Ownership-”的所有者,然后在制作我们的字典时,我们删除“Server-Ownership-”部分,只留下名字。
  • 那么我将如何自动一一引用每个名称以使用与其关联的 id 来执行获取请求?脚本的目标是运行它并让它自己做所有事情。
【解决方案2】:

您可以将这些保存为字典并通过调用键获取值。

server_owners_dict = {'Server-Ownership-A': 100,
'Server-Ownership-B': 200,
'Server-Ownership-C': 300,
'Server-Ownership-D': 400,
'Server-Ownership-E': 500,
'Server-Ownership-F': 600,
'Server-Ownership-G': 700,
'Server-Ownership-H': 800}


print(server_owners_dict['Server-Ownership-E'])
500

将 print 更改为函数并返回要在请求中使用的 id。

【讨论】:

  • 我可以将脚本设置为自动将matchedOwners中找到的任何内容变成字典吗?
  • 另外,这些服务器名称可以更改,我尽量不要将它们硬编码到脚本中,以防它们在未来发生变化。它们将始终以“服务器所有权-”开头
【解决方案3】:

您不需要将值放在字符串中,然后使用正则表达式。只需直接测试i['name'] 并将其用作字典键即可。

server_owners = {}
for i in data['resources']:
    if 'id' in i and 'name' in i and i['name'].startswith('Server-Ownership-'):
        server_name = i['name'].split('-')[-1] # get A from Server-Ownership-A
        server_owners[server_name] = i['id']

这将创建一个类似的字典

{'A': 100, 'B': 200, 'C': 300, ...}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多