json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 40

背景

调用某个接口的api,然后获取数据,分析用

data = json.loads(resp.text)

过程提示:

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 40 (char 39)

一开始以为只是单引号的问题(json对符号严格,单引号会解析报错,双引号才可以),就直接

resp.text.replace("", '"')
# 将单引号替换为双引号

然后再 json.loads(resp.text),发现还是报错。
没办法只能猜测返回值里面含有一些奇奇怪怪的符号格式

分析

通过对resp.text得知(当然也可以分析resp.content。text为str类型,content为bytes类型,也就是编码后的json格式),返回的接口字符并不符合json解析。

resp.text.replace("", '"')
# 将单引号替换为双引号

发现还是报错,分析报错日志,里面的报错部分内容如下:

{"success":true, "message":"","data":{total:222,root:[{'article_card__num':'3','asset_card__syn_date':(new Date(2023, 1, 7, 4, 1,26))}],all:[]}}

佛了,这陈年旧接口,又是双引号,又是单引号,又日期类型(关键是之前前端JS还能正常解析到)。

解决

这里报错的核心是json解析不了字符串里面的

(new Date(2023, 1, 7, 4, 1,26)

那就想办法替换掉

resp.text.replace('(new Date(', '"').replace('))', '"')

通常我们会提取到需要的部分,然后为了避免单引号影响,所以

resp.text[54:-12].replace('(new Date(', '"').replace('))', '"').replace("'", '"')

当然这里如果resp.text[23:-12]不是一个固定的字符串,则考虑正则提取

import re
pattern_str = r'root:(.*),all'
pattern = re.compile(pattern_str)
result = re.search(pattern, res)
data = result.group(1) # 提取到对应正则中(.*)部分,也就是需要的值
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值