使用Spotify Web-API调用transferMyPlayback()时遇JSON格式错误
解决Spotify Web API transferMyPlayback() 400 "Malformed json"错误
我之前也碰到过一模一样的问题,其实核心原因是你对spotify-web-api-js库的参数传递逻辑理解错了——你不需要手动把参数转成JSON字符串,库本身会自动处理请求体的序列化工作,手动转JSON反而会让API收到格式错误的内容。
你的代码问题分析
看你的代码片段:
var deviceIds = {}; deviceIds["device_ids"] = [id]; var deviceIds_JSON = JSON.stringify(deviceIds); // 然后把deviceIds_JSON传给transferMyPlayback?
当你把已经stringify后的JSON字符串传给transferMyPlayback方法时,库会再次对这个字符串做序列化,最终发送给Spotify API的请求体就变成了类似"{"device_ids":["xxx"]}"这样的格式——这是一个被字符串包裹的JSON,完全不符合API要求的纯JSON对象,自然会返回400错误。
正确的调用方式
spotify-web-api-js的transferMyPlayback方法接受一个普通JavaScript对象作为参数,直接传递包含device_ids数组的对象即可:
基础写法(仅切换设备)
// 假设你已经通过getMyDevices()获取到目标设备ID:id spotifyApi.transferMyPlayback({ device_ids: [id] }) .then(function(data) { console.log('播放设备切换成功!', data); }) .catch(function(err) { console.error('切换失败:', err); });
附带播放状态控制(可选)
如果需要切换设备后立即恢复播放,可以加上play参数:
spotifyApi.transferMyPlayback({ device_ids: [id], play: true // 切换后自动播放,默认值为false }) .then(function(data) { console.log('播放设备切换并开始播放!', data); }) .catch(function(err) { console.error('操作失败:', err); });
额外排查点
如果按上面的写法还是报错,可以检查这两点:
- 设备ID是否有效:确保
id是从getMyDevices()接口获取到的合法设备ID,不要用自定义的字符串或无效ID。 - 权限是否齐全:你的Spotify应用必须申请了
user-modify-playback-state权限,否则会返回权限相关错误(不过此时错误码通常是403,而非400)。
内容的提问来源于stack exchange,提问作者Patapinho
相关产品推荐
相关产品推荐

