Получение данных из API, если у записи JSON нет имени контейнера - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь получить данные из API для нашей системы управления персоналом.Но когда извлекается отдельная фотография, у файла JSON больше нет имени контейнера, что нарушает мой текущий скрипт.

Для доступных API, когда вы запрашиваете все фотографии сотрудников в 1 запросе, он возвращает только миниатюру фото. Чтобы получитьНа большом фото вы должны сделать это по 1 сотруднику за раз и включить идентификатор работника в URL.Однако проблема заключается в том, что при выполнении последнего не отображается имя объекта только элементы в документе.

import json
import pyodbc
import requests

url = "https://someurl.com/api/PersonPhoto"

headers = {
    'Accept': "application/json",
    'Authorization': "apikey xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    'Content-Type': "application/json",
    'cache-control': "no-cache"
    }

response = requests.request("GET", url, headers=headers)
data = json.loads(response.text)


ID,Photo,PhotoDate,PhotoType = [],[],[],[]

for device in data['PersonPhoto']:

    ID.append(device[u'ID'])

    Photo.append(device[u'Photo'])

    PhotoDate.append(device[u'PhotoDate'])

    PhotoType.append(device[u'PhotoType'])


connStr = pyodbc.connect(
    "DRIVER={SQL Server};"
    "SERVER=TestSrver;"
    "Database=MyDB;"
    "Trusted_Connection=yes;"}"
    )
cursor = connStr.cursor()

sql = "INSERT INTO dbo.Employee_Photo2 ([EmployeeID],[PhotoBinary],[PhotoDate],[FileType]) VALUES (?,?,?,?)"

vals = [(int(device[u'ID']), device[u'Photo'], device[u'PhotoDate'],  device[u'PhotoType']) \
       for device in data['PersonPhoto']]

cursor.executemany(sql, vals)   
connStr.commit()
cursor.close()
connStr.close()

Приведенный выше код работает, когда я вытаскиваю всех сотрудников.Вытащить 1 сотрудника для получения большой фотографии - это тот же вызов API, за исключением того, что вы должны указать идентификатор сотрудника в конце URL-адреса.

Проблема, с которой я сталкиваюсь, заключается в том, что когда вы делаете этот вызов API, он больше не включает имя объекта PersonPhoto в результирующий JSON, он просто возвращает 4 атрибута в фигурных скобках.Поэтому я не уверен, как изменить приведенный выше код для обработки отсутствия имени объекта.

JSON, который работает с вышеуказанным сценарием:

{
    "PersonPhoto": [
        {
            "ID": 123,
            "Name": "Test User",
            "Photo": "/9j/4AAQSkZJRgABAQEAYABgAAD",
            "PhotoDate": "2019-05-02T00:00:00",
            "PhotoType": ".jpg"
        }
    ]
}

JSON, который возвращается при передачеemployeeid в конце URL:

{
    "ID": 123,
    "Name": "Test User",
    "Photo": "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKD",
    "PhotoDate": "2019-05-02T00:00:00",
    "PhotoType": ".jpg"
}

1 Ответ

0 голосов
/ 10 мая 2019

Краткий ответ: вы можете добавить обработку исключений с помощью оператора try: exception: для обработки ошибки, возникающей при ссылке на несуществующий ключ словаря.

С чисто функциональной точки зрения это хорошее решение, но лучше бы было написать две отдельные функции для обработки ожидаемого JSON по-разному, в зависимости от вызова API, который вы делаете

Если вы просто ТОЛЬКО собираетесь обрабатывать новый вариант использования, вы можете просто ссылаться на данные следующим образом:

user = "12345"
url = "https://someurl.com/api/PersonPhoto/{}".format(user)
response = requests.request("GET", url, headers=headers)
data = json.loads(response.text)
ID = [data['ID']]
Photo = [data['Photo']]
PhotoDate = [data['PhotoDate']]
PhotoType = [data['PhotoType']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...