我正在尝试从HR系统的api中提取数据。但是当提取单个照片时,JSON文件不再具有容器名称,这会破坏我当前的脚本。
对于可用的api,当您在1个请求中请求所有员工照片时,它仅返回缩略图。要获取大照片,您必须一次处理1个员工,并在URL中包括employeeid。但是,问题在于,后者不能仅显示文档中的项目的对象名称。
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调用,除了您必须将员工ID放在网址末尾。
我遇到的问题是,当您进行此api调用时,它不再在结果JSON中包含PersonPhoto的对象名,它只返回大括号内的4个字符。因此,我不确定如何更改以上代码以解决缺少对象名称的问题。
与上述脚本兼容的JSON:
{
"PersonPhoto": [
{
"ID": 123,
"Name": "Test User",
"Photo": "/9j/4AAQSkZJRgABAQEAYABgAAD",
"PhotoDate": "2019-05-02T00:00:00",
"PhotoType": ".jpg"
}
]
}
当您在URL末尾传递employeeid时返回的JSON:
{
"ID": 123,
"Name": "Test User",
"Photo": "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKD",
"PhotoDate": "2019-05-02T00:00:00",
"PhotoType": ".jpg"
}
答案 0 :(得分:0)
简短的答案是,您可以使用try:except:语句添加异常处理,以处理引用不存在的字典键时发生的错误。
从纯函数的角度来看,这是一个很好的解决方案,但是更好的做法可能是编写两个单独的函数,以根据所进行的api调用来不同地处理预期的JSON
如果您仅打算处理新的用例,则可以通过以下方式引用数据:
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']]