【问题标题】:How to iterate through each JSON object and hit the API?如何遍历每个 JSON 对象并访问 API?
【发布时间】:2019-04-03 19:05:33
【问题描述】:

我的代码将 Excel 文件转换为 JSON 文件,然后 JSON 文件访问 API 以在我的应用程序中创建请求。

我的 JSON 输出如下所示:

{
   "data": [
      {
         "requestedStart": "2018-11-16",
         "requestedComplete": "2018-11-18",
         "location": "Test",
         "equipment": "Test",
         "switchID": 1
      },
      {
         "requestedStart": "2018-11-23",
         "requestedComplete": "2018-11-25",
         "location": "Test",
         "equipment": "Test",
         "switchID": 1
      }
   ]
}

我的代码:

def json_from_excel():
    excel_file = 'test.xlsx'
    jsonfile = open('ExceltoJSON.json', 'w')
    data = []
    loaddata = OrderedDict()
    workbook = xlrd.open_workbook(excel_file)
    worksheet = workbook.sheet_by_name('testExceldata')
    sheet = workbook.sheet_by_index(0)

    for j in range(0, 6):
        for i in range(1, 4):         
            temp = {}
            temp["requestedStart"] = (sheet.cell_value(i, 0))
            temp["requestedComplete"] = (sheet.cell_value(i, 1))
            temp["location"] = (sheet.cell_value(i, 2))           
            temp["equipment"] = (sheet.cell_value(i, 3))         
            temp["switchID"] = (sheet.cell_value(i, 4))
            data.append(temp)
            loaddata['data'] = data
        json.dump(loaddata, jsonfile, indent=3, sort_keys=False)
        jsonfile.write('\n')
        return loaddata

if __name__ == '__main__':
    data = json_from_excel()
    AUTH_HEADERS = {
        'Token': '5ab15b5a66',
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }
    s = requests.session()
    s.headers = AUTH_HEADERS
    data = json.dumps(dict(data))
    print (data)
    url = 'https://myurl/external/api/v1/Request'
    result = s.post(url, data=data, verify=False)
    print(result.text)
    s.close()

但我的 API 一次只能接受一个对象。所以我想创建一个循环,这样程序将采用第一个对象,即

  {
     "requestedStart": "2018-11-16",
     "requestedComplete": "2018-11-18",
     "location": "Test",
     "equipment": "Test",
     "switchID": 1
  }

然后点击 API 创建请求,然后返回获取第二个对象并点击 API,以此类推。

如何创建这样的循环?

【问题讨论】:

    标签: json python-3.x api


    【解决方案1】:

    您可以轻松地遍历您拥有的数据数组:

    # data = json.dumps(dict(data)) -- this is not needed
    url = 'https://myurl/external/api/v1/Request'
    for post_data in data['data']:
        result = s.post(url, json=post_data, verify=False)
        print(result.text)
    s.close()
    

    当您使用session.post() 时,它可以表现多种方式,see the docs

    • data 是一个字典:POST 表单编码数据。这与 HTTP 表单一起使用
    • data 是一个字符串:使用您编码的数据进行 POST,必须相应设置标头
    • json 是一个字典:使用 JSON 数据POST 并自动设置application/json

    这意味着您也可以使用 data=json.dumps(data) 将其作为 JSON 发送,但我建议使用 json 参数。

    【讨论】:

    • 我试过这个。但是数据输出用单引号括起来。 {'requestedStart':'2018-11-16T08:00:00Z','requestedComplete':'2018-11-18T17:00:00Z','位置':'TAWAU','设备':'GT2',' switchOrderTypeID': 1} 因此,它没有命中 api。我需要用双引号括起来。
    • 它用单引号打印,因为这是python中字符串的默认解释。它与您的请求的发送方式无关。您的回复究竟是什么?
    • 这里的问题在于 data = json.dumps(dict(data)) 。在原始代码中使用这一行时,我在双引号中获取命中 api 的数据。但是您所说的解决方案(因为您说要删除 data=json.dumps),它是用单引号打印输出。但是,如果我将 data=json.dumps 与您的解决方案一起使用,我会收到此类型错误“字符串索引必须是整数”
    • 抱歉,出于某种原因,我认为您需要表单编码值,但我相应地更新了我的答案。
    • 谢谢伙计。它工作得很好。感谢您的宝贵建议:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多