Как выполнить итерацию по каждому объекту JSON и попасть в API?

#json #python-3.x #api

#json #python-3.x #API

Вопрос:

Мой код преобразует файл 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, и так далее.

Как мне создать такой цикл?

Ответ №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() , он может вести себя по-разному, смотрите Документы.

  • data является словарем: данные, закодированные в форме POST. Это используется с HTTP-формами
  • data является строкой: ПУБЛИКАЦИЯ с закодированными вами данными, заголовки должны быть установлены соответствующим образом
  • json является словарем: POST с данными JSON с application/json автоматически установленным

Это означает, что вы также можете data=json.dumps(data) отправить его в виде JSON, но я предлагаю использовать json параметр.

Комментарии:

1. Я пробовал это. Но выходные данные заключаются в одинарные кавычки. {‘requestedStart’: ‘2018-11-16T08:00:00Z’, ‘requestedComplete’: ‘2018-11-18T17:00:00Z’, ‘location’: ‘TAWAU’, ‘equipment’: ‘GT2’, ‘switchOrderTypeID’: 1} Из-за этого он не попадает в api. Мне это нужно в двойных кавычках.

2. он печатается в одинарных кавычках, потому что это интерпретация строк по умолчанию в python. Это не имеет никакого отношения к тому, как отправляется ваш запрос. Что именно содержится в вашем ответе?

3. Проблема здесь в строке data = json.dumps(dict(данные)) . Используя эту строку в исходном коде, я получаю данные в двойных кавычках, которые попадают в api. Но решение, о котором вы сказали (поскольку вы сказали удалить data=json.dumps), заключается в печати выходных данных в одинарных кавычках. Но если я использую строку data=json.dumps вместе с вашим решением, я получаю ошибку такого типа «Строковые индексы должны быть целыми числами».

4. Извините, по какой-то причине я предположил, что вам нужны значения в кодировке формы, но я соответствующим образом обновил свой ответ.

5. Спасибо, чувак. Это сработало идеально. Спасибо за ценное предложение 🙂