如何将多个 API 请求写入有效的 JSON 文件?

How do I write multiple API requests to a valid JSON file?

我正在尝试在 python 脚本中请求多个 api 调用。由于我的代码现在已设置,因此我正在使用请求建立连接并循环访问 API 网址。 JSON 响应被写入文件,因此我可以在外部操作数据。我能够毫无问题地建立连接并将响应写入文件。 然而,当我尝试在 jsonlint 中验证完成的文件时,我的问题出现了,它告诉我我有多个顶级字段,看起来是响应 headers。 所以问题是我如何循环遍历 APIs 来编写一个有效的 JSON 文件?

到目前为止,我已尝试将 JSON 响应更改为 python 字典,但现在我对接下来要尝试的内容有点不知所措..

这是我的 request/file 写作片段:

for x, y in sites[data[z]].items():
    url = "".join(y['host'] + endpoint + 'customer_id=' + y['customer_id'] +
                  '&requestor_id=' + y['requestor_id'] + '&api_key=' + y['api_key'])
    urls = url + "&begin_date=" + begin + "&end_date=" + end

    r = requests.get(urls)  # make connections to vendors
    print("Connection Status: ", r.status_code)  # print http response code

    try:
        r.json()  # get data from vendors
    except json.decoder.JSONDecodeError:
        print(urls, "This is not a JSON format..")  # catch vendor JSON errors

    print("I'm saving your usage statistics to a text file.")
    with open(reportName + '-' + begin + '-' + end + '.json', 'a') as datafile:
        json.dump(r.json(), datafile)  # write api resp to .JSON file

    print("I'\'m done writing your usages to file:" + reportName + '-' + begin
          + '-' + end + ".json.")

这是 api 回复

{  
   "Report_Header":{  },
   "Report_Items":[  ]
}{  
   "Report_Header":{  },
   "Report_Items":[  ]
}

这里:

with open(reportName + '-' + begin + '-' + end + '.json', 'a') as datafile:
    json.dump(r.json(), datafile)

您将 json 片段附加到同一个文件,这确实不会产生有效的 json - 即:

# cat youfile.json
{'foo': 'bar'}{'foo': 'baaz'}{'foo': 42}

无效。

如果你想将所有收集的数据保存在同一个文件中,你必须先将它们收集到一个列表中(或字典,但你必须为每个 json 片段提供键)并且只然后将结果转储到以写入模式打开的文件(以确保它是空白的)。

您可以构造一个 JSON 这种形式的文件,

,而不是将所有响应收集到一个列表中然后写入它们
{"responses":[
   {  
   "Report_Header":{  },
   "Report_Items":[  ]
   },
   {  
   "Report_Header":{  },
   "Report_Items":[  ]
   }
 ]
}

这实际上是一个有效的 json 对象。您可以通过对代码进行以下修改来实现它:

with open(fileName, 'a') as datafile:
    datafile.write('{"responses":[')

for x, y in sites[data[z]].items():
    url = "".join(y['host'] + endpoint + 'customer_id=' + y['customer_id'] +
                  '&requestor_id=' + y['requestor_id'] + '&api_key=' + y['api_key'])
    urls = url + "&begin_date=" + begin + "&end_date=" + end

    r = requests.get(urls)  # make connections to vendors
    print("Connection Status: ", r.status_code)  # print http response code

    try:
        r.json()  # get data from vendors
    except json.decoder.JSONDecodeError:
        print(urls, "This is not a JSON format..")  # catch vendor JSON errors

    print("I'm saving your usage statistics to a text file.")
    with open(fileName, 'a') as datafile:
        json.dump(r.json(), datafile)  # write api resp to .JSON file
        datafile.write(",") # add comma for JSON array element

with open(fileName, 'a') as datafile:
    datafile.seek(0, os.SEEK_END) # Move to last 
    datafile.seek(datafile.tell() - 1, os.SEEK_SET) # back One character
    datafile.truncate() # Delete the last comma ","
    datafile.write(']}')

print("I'\'m done writing your usages to file:" + fileName)

现在您可以根据需要解析 JSON 文件以供外部使用。