Python解析Spotify Album API字典报错:ast.literal_eval与JSON.loads异常
解决Spotify Album API返回内容解析异常的问题
看起来你遇到的问题大概率是返回内容里混入了隐藏控制字符,或是Python字典格式与JSON格式的语法差异导致的。我给你分步骤梳理解决方案:
1. 先定位问题根源:找到异常字符
别只依赖VIM的显示,用Python直接打印第3072位附近的字符编码,搞清楚到底是什么在搞鬼:
# 把你的字典内容赋值给content变量,或者从文件读取 content = "你的字典内容字符串" # 查看3070-3080位置的字符细节 for i in range(3070, 3080): if i < len(content): char = content[i] print(f"位置{i}: '{char}' (Unicode编码: {ord(char)})")
通过这段代码你能看到是不是有不可打印的控制字符(比如\x00空字符、\u200B零宽空格),或是编码错误的字符。
2. 针对两种解析错误的修复方案
方案一:修复JSON解析的SyntaxError
json.loads报错通常是内容不符合JSON规范:比如用了单引号而非双引号、出现Python特有的None/True/False(JSON要求null/true/false)、或是有多余的尾逗号(比如[1,2,])。可以用以下代码修正:
import json import re # 1. 把单引号替换为双引号(如果是保存时格式被篡改的话) content = content.replace("'", '"') # 2. 替换Python风格的布尔值和空值为JSON格式 content = content.replace("True", "true").replace("False", "false").replace("None", "null") # 3. 移除多余的尾逗号 content = re.sub(r",\s*([}\]])", r"\1", content) try: data = json.loads(content) print("JSON解析成功!") except json.JSONDecodeError as e: print(f"解析失败,错误位置{e.pos}: {e.msg}") # 打印错误位置前后20个字符,方便精准定位 print(content[e.pos-20:e.pos+20])
方案二:修复ast.literal_eval的ValueError
ast.literal_eval对Python字面量格式要求极严,不能有多余逗号、不能有非字面量内容。可以先清理控制字符再尝试:
import ast import string # 过滤掉所有不可打印的控制字符(保留换行、制表符这类常用格式符) clean_content = ''.join([c for c in content if c in string.printable or c in '\n\t']) try: data = ast.literal_eval(clean_content) print("ast解析成功!") except ValueError as e: print(f"解析错误: {e}") # 可以尝试分段测试,比如先解析前3000字符,再逐步扩大范围找到具体错误点
3. 最优解决方案:直接用API响应的内置解析方法
如果你是直接从Spotify API请求数据,千万别手动处理响应文本!用requests库的response.json()方法直接解析,这才是最可靠的方式:
import requests # 替换成你的请求URL和认证头 url = "https://api.spotify.com/v1/albums/{你的专辑ID}" headers = {"Authorization": "Bearer {你的访问令牌}"} response = requests.get(url, headers=headers) response.raise_for_status() # 检查请求是否成功 data = response.json() # 直接解析成字典,一步到位!
这种方法完全避免了手动处理字符串的各种坑,因为Spotify API返回的是标准JSON,requests会自动处理编码和格式问题。
4. 处理顽固的隐藏字符
如果上面的方法都不行,大概率是有奇怪的隐藏字符。可以用以下代码过滤掉所有非可打印字符:
clean_content = ''.join(filter(lambda x: x.isprintable() or x in '\n\r\t', content))
之后再用上面的解析方法尝试。
内容的提问来源于stack exchange,提问作者yac
相关产品推荐
相关产品推荐

