当前位置:   article > 正文

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

json.decoder.jsondecodeerror: expecting property name enclosed in double quo

背景

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

data = json.loads(resp.text)
  • 1

过程提示:

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

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

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

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

分析

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

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

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

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

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

解决

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

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

那就想办法替换掉

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

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

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

当然这里如果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) # 提取到对应正则中(.*)部分,也就是需要的值
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/400926
推荐阅读
相关标签
  

闽ICP备14008679号