Как записать несколько запросов API в допустимый файл JSON? - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь запросить несколько вызовов API в скрипте Python. Поскольку мой код настроен сейчас, я использую запросы на установление соединений и циклический переход по URL-адресам 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 ]

1 голос
/ 12 июня 2019

Вместо того чтобы собирать все ответы в списке и затем записывать их, вы можете создать файл 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 для внешнего использования, как вам угодно.

1 голос
/ 12 июня 2019

Здесь:

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}

НЕ допустимо.

если вы хотите сохранить все собранные данные в одном файле, вы должны сначала собрать их в список (или dict, но вам нужно будет предоставить ключи для каждого фрагмента json), а затем вывести дампрезультат для файла, открытого в режиме записи (чтобы убедиться, что он пуст).

...