【发布时间】:2021-04-23 02:23:41
【问题描述】:
如何处理 JSON 响应中的缺失数据? 我正在尝试从网站的 API 获取数据,以便将其附加到列表中,然后再将其插入 SQL 数据库。我的问题是某些值并不总是在响应正文中,当我尝试将其附加到列表中时会引发错误。 API 请求并将响应的 json 添加到名为“data”的变量中(API KEY 和 secret 是任何人都可以使用的免费测试用户):
import requests
import pyodbc
url = 'https://app.omie.com.br/developer/api-test/?url=https://app.omie.com.br/api/v1/financas/mf/&OMIE_APP_KEY=38333295000&OMIE_APP_SECRET=4cea520a0e2a2ecdc267b75d3424a0ed&OMIE_CALL=ListarMovimentos'
test1 = {
"nPagina": 1,
"nRegPorPagina": 500
}
res = requests.post(url, json=test1)
data = res.json()
JSON 响应(不是全部,因为它很大):
我需要的数据在response->movimentos->detalhes
{
"information": {
"url": "https://app.omie.com.br/api/v1/financas/mf/",
"content_type": "application/json; encoding=UTF-8",
"http_code": 200,
"header_size": 529,
"request_size": 270,
"filetime": -1,
"ssl_verify_result": 0,
"redirect_count": 0,
"total_time": 6.309164,
"namelookup_time": 2.7e-5,
"connect_time": 0.001066,
"pretransfer_time": 0.018146,
"size_upload": 143,
"size_download": 221588,
"speed_download": 35122,
"speed_upload": 22,
"download_content_length": 221588,
"upload_content_length": 143,
"starttransfer_time": 6.303321,
"redirect_time": 0,
"redirect_url": "",
"primary_ip": "52.67.79.140",
"certinfo": [],
"primary_port": 443,
"local_ip": "10.0.5.217",
"local_port": 54770
},
"request": {
"call": "ListarMovimentos",
"app_key": "38333295000",
"app_secret": "4cea******************a0ed",
"param": [
{
"nPagina": 1,
"nRegPorPagina": 500
}
]
},
"response_header": [
"HTTP/1.1 200 OK\r",
"Date: Mon, 18 Jan 2021 18:43:18 GMT\r",
"Content-Type: application/json; encoding=UTF-8\r",
"Content-Length: 221588\r",
"Connection: keep-alive\r",
"Server: nginx\r",
"X-Omie-Request-Id: 03c78330-59bd-11eb-bc89-791b8d1252d3\r",
"Expires: Tue, 03 Jul 2001 06:00:00 GMT\r",
"Last-Modified: Mon, 18 Jan 2021 18:43:18 GMT\r",
"Cache-Control: no-store, no-cache, must-revalidate, max-age=0\r",
"Cache-Control: post-check=0, pre-check=0\r",
"Pragma: no-cache\r",
"Vary: Accept-Encoding\r",
"Strict-Transport-Security: max-age=31536000; includeSubDomains; preload\r",
"\r",
""
],
"response": {
"nPagina": 1,
"nTotPaginas": 9,
"nRegistros": 500,
"nTotRegistros": 4336,
"movimentos": [
{
"detalhes": {
"cCPFCNPJCliente": "24.111.930/0001-80",
"cCodCateg": "1.01.02",
"cGrupo": "PREVISAO_CONTRATO",
"cNatureza": "R",
"cNumCtr": "2020/01001",
"cNumParcela": "001/001",
"cOperacao": "01",
"cOrigem": "VENR",
"cStatus": "PREVISAO",
"cTipo": "99999",
"dDtEmissao": "30/10/2021",
"dDtPrevisao": "04/11/2021",
"dDtVenc": "04/11/2021",
"nCodCC": 1208238,
"nCodCliente": 2370765,
"nCodCtr": 462539320,
"nCodTitulo": 300462539320001,
"nValorTitulo": 3302
}
},
{
"detalhes": {
"cCPFCNPJCliente": "24.111.930/0001-80",
"cCodCateg": "1.01.02",
"cGrupo": "PREVISAO_CONTRATO",
"cNatureza": "R",
"cNumCtr": "2020/01001",
"cNumParcela": "001/001",
"cOperacao": "01",
"cOrigem": "VENR",
"cStatus": "PREVISAO",
"cTipo": "99999",
"dDtEmissao": "30/11/2021",
"dDtPrevisao": "05/12/2021",
"dDtVenc": "05/12/2021",
"nCodCC": 1208238,
"nCodCliente": 2370765,
"nCodCtr": 462539320,
"nCodTitulo": 300462539320001,
"nValorTitulo": 3302
}
},
{
"detalhes": {
"cCPFCNPJCliente": "24.111.930/0001-80",
"cCodCateg": "1.01.02",
"cGrupo": "PREVISAO_CONTRATO",
"cNatureza": "R",
"cNumCtr": "2020/01001",
"cNumParcela": "001/001",
"cOperacao": "01",
"cOrigem": "VENR",
"cStatus": "PREVISAO",
"cTipo": "99999",
"dDtEmissao": "30/12/2021",
"dDtPrevisao": "04/01/2022",
"dDtVenc": "04/01/2022",
"nCodCC": 1208238,
"nCodCliente": 2370765,
"nCodCtr": 462539320,
"nCodTitulo": 300462539320001,
"nValorTitulo": 3302
}
},
{
"detalhes": {
"cCPFCNPJCliente": "24.111.930/0001-80",
"cCodCateg": "1.01.02",
"cGrupo": "PREVISAO_CONTRATO",
"cNatureza": "R",
"cNumCtr": "2020/01001",
"cNumParcela": "001/001",
"cOperacao": "01",
"cOrigem": "VENR",
"cStatus": "PREVISAO",
"cTipo": "99999",
"dDtEmissao": "30/01/2022",
"dDtPrevisao": "04/02/2022",
"dDtVenc": "04/02/2022",
"nCodCC": 1208238,
"nCodCliente": 2370765,
"nCodCtr": 462539320,
"nCodTitulo": 300462539320001,
"nValorTitulo": 3302
}
},
{
"detalhes": {
"cCPFCNPJCliente": "24.111.930/0001-80",
"cCodCateg": "1.01.02",
"cGrupo": "PREVISAO_CONTRATO",
"cNatureza": "R",
"cNumCtr": "2020/01001",
"cNumParcela": "001/001",
"cOperacao": "01",
"cOrigem": "VENR",
"cStatus": "PREVISAO",
"cTipo": "99999",
"dDtEmissao": "28/02/2022",
"dDtPrevisao": "05/03/2022",
"dDtVenc": "05/03/2022",
"nCodCC": 1208238,
"nCodCliente": 2370765,
"nCodCtr": 462539320,
"nCodTitulo": 300462539320001,
"nValorTitulo": 3302
"dDtRegistro": "19/02/2014",
}
}
]
}
}
能够迭代的数据,因为它是强制响应:
for i in data['response']['movimentos']:
lista_cod.extend(i['detalhes']['cCodCateg'])
我无法正确遍历的数据,因为它并不总是在响应正文中,因为我试图处理:
for i in data['response']['movimentos']:
try:
lista_datas.extend(i['detalhes']['dDtRegistro'])
except:
lista_datas.extend('')
我还尝试将extendit 设置为None,但未成功。结果我得到了列表:
['2', '2', '/', '0', '1', '/', '2', '0', '2', '0', '2', '1', '/', '0', '1', '/', '2', '0', '2', '0', '2', '1', '/', '0', '1', '/', '2', '0', '2', '0'...
我看到这种情况正在发生,因为我使用了 try 但是如果我不这样做,我会收到错误消息
另外,有没有更好的方法将此数据插入 SQL 数据库? 除了 extend 将其插入列表并稍后遍历该列表以将其插入。
【问题讨论】:
标签: python json list exception python-requests