使用Google Script调用Home Assistant API时出现JSON解析错误求助
问题分析与解决
报错SyntaxError: Unexpected non-whitespace character after JSON at position 3说明执行JSON.parse(data)时,返回的data并非有效JSON格式。虽然Postman请求正常,但Google Script的请求环境和Postman存在差异,常见原因及解决方法如下:
可能原因
- 证书验证问题:Home Assistant若使用自签名证书,Google Script的
UrlFetchApp会默认拦截,返回证书错误的HTML页面而非JSON,导致解析失败。 - 请求头缺失:Postman会自动添加
Accept: application/json头,你的代码未明确指定该字段,部分场景下Home Assistant可能返回非JSON内容。
解决方案
1. 先排查返回内容
查看Logger.log(response.getContentText())的输出:如果是HTML页面,确认为证书问题;如果是错误文本或非标准JSON,针对性处理。
2. 修改请求参数
更新options对象,添加必要请求头并处理证书验证(若为自签证书):
function fetchHomeAssistantData() { var url = "https://myurl:8123/api/states/sensor.produzione_max_oggi"; var token = "myapikey"; var options = { "method": "GET", "headers": { "Authorization": "Bearer " + token, "Accept": "application/json" // 明确要求返回JSON格式 }, "muteHttpExceptions": true, "validateHttpsCertificates": false // 跳过自签证书验证,注意安全风险 }; var response = UrlFetchApp.fetch(url, options); // 打印状态码和返回内容,方便排查 Logger.log("状态码: " + response.getResponseCode()); Logger.log("返回内容: " + response.getContentText()); var data = response.getContentText(); // 仅在请求成功时解析JSON if (response.getResponseCode() === 200) { try { var jsonData = JSON.parse(data); var state = jsonData.state; var lastChanged = jsonData.last_changed; Logger.log("传感器状态: " + state + ", 更新时间: " + lastChanged); } catch (e) { Logger.log("JSON解析错误: " + e.message); } } else { Logger.log("请求失败,状态码: " + response.getResponseCode()); } }
3. 安全提示
关闭证书验证存在安全风险,建议给Home Assistant配置受信任的SSL证书(如Let's Encrypt),避免使用validateHttpsCertificates: false。
内容的提问来源于stack exchange,提问作者emanuele mattiolo
相关产品推荐
相关产品推荐

