【问题标题】:Handling API JSON Response Exceptions处理 API JSON 响应异常
【发布时间】: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


    【解决方案1】:

    问题出在extend,而我应该append 列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-28
      • 2016-05-24
      • 2022-07-29
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      相关资源
      最近更新 更多