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

时间:2019-06-12 13:17:24

标签: python json api python-requests file-writing

我正在尝试在python脚本中请求多个api调用。现在我的代码已设置好,我正在使用请求进行连接并循环访问API网址。 JSON响应已写入文件,因此我可以在外部处理数据。我能够建立连接并将响应写到文件中而不会出现问题。 但是,当我尝试在jsonlint中验证完成的文件时会出现问题,这告诉我我有多个顶级字段,这些字段看起来是响应头。 因此,问题是如何遍历我的API以编写单个有效的JSON文件?

到目前为止,我已经尝试将JSON响应更改为python字典,但是现在我对下一步尝试感到有些茫然。

这是我的请求/文件编写摘要:

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":[  ]
}

2 个答案:

答案 0 :(得分:1)

这里:

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代码段提供密钥),然后再将结果转储到文件以写入模式打开(以确保为空白)。

答案 1 :(得分:1)

您可以构建这种形式的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文件以供外部使用。