使用json.loads提取JSON中linkBoleto值失败求助
问题:无法从API返回的JSON中提取
linkBoleto字段 能正常获取API返回的数据,但使用json.loads解析后,无法定位到目标字段linkBoleto。
JSON数据结构
{ "retorno":{ "contasreceber":[ { "contareceber":{ "id":"13123121", "situacao": "aberto", "dataEmissao":"2017-03-09", "vencimentoOriginal":"2017-03-09", "vencimento":"2017-03-09", "competencia":"2017-03-01", "nroDocumento":"0123456", "valor":15.00, "saldo":0.00, "historico":"Referente ao pedido de venda nº 423", "categoria":"Vendas", "idFormaPagamento": "123", "portador":"CEF", "nroNoBanco":"00100358-56", "vendedor":"Vendedor exemplo", "pagamento": { "totalPago": 15.00, "totalJuro": 0, "totalDesconto": 0, "totalAcrescimo": 0, "totalTarifa": 0, "data": "2017-03-09" }, "ocorrencia":"Unica", "linkBoleto":"https://www.bling.com.br/doc.view.php?132", "cliente":{ "nome":"Organisys Software", "cpf_cnpj":"00.000.000/0000-1", "tipoPessoa":"J", "ie_rg":"0000000000", "endereco":"Rua Barão do Rio Branco", "numero":"000", "complemento":"Sala 000", "cidade":"Bento Gonçalves", "bairro":"Centro", "cep":"00.000-000", "uf":"RS", "email":"teste@organisys.com.br" } } } ] } }
尝试的代码
import requests import json cnpj_consulta = '00.000.000/0000-1' api_key = 'my-api-key' url = 'https://bling.com.br/Api/v2/contasreceber/json/' f_key ='&apikey=' f_cnpj = '&filters=cnpj' op = '[' cl = ']' r = requests.get(f'{url}{f_key}{api_key}{f_cnpj}{op}{cnpj_consulta}{cl}') y = json.loads(r.content) print(y['linkBoleto'])
解决方案
问题出在取值路径错误:linkBoleto不在JSON的根层级,而是嵌套在多层结构里,正确的层级是:retorno -> contasreceber(数组)-> 数组元素 -> contareceber -> linkBoleto
修正后的代码
import requests import json cnpj_consulta = '00.000.000/0000-1' api_key = 'my-api-key' url = 'https://bling.com.br/Api/v2/contasreceber/json/' params = { 'apikey': api_key, 'filters': f'cnpj[{cnpj_consulta}]' } # 用params传递参数更规范,避免字符串拼接出错 r = requests.get(url, params=params) y = json.loads(r.content) # 逐层访问目标字段,同时添加空值判断避免报错 if y.get('retorno', {}).get('contasreceber'): link_boleto = y['retorno']['contasreceber'][0]['contareceber']['linkBoleto'] print(link_boleto) else: print("未找到相关收款记录或linkBoleto字段")
说明
- 替换字符串拼接参数的方式,改用
requests.get的params参数,更安全且易维护。 - 添加空值判断逻辑,避免因API返回空数组或字段缺失导致的
KeyError。 - 严格按照JSON层级结构取值,确保定位到正确的目标字段。
内容的提问来源于stack exchange,提问作者Christian Rodrigues
相关产品推荐
相关产品推荐

