You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:17:53