javascript - 语法错误: Unexpected token in JSON at position 0

标签 javascript c# json wcf

我在使用 Whatwg-fetch npm 从 javascript 节点模块访问 .Net WCF 提供的 REST 服务时遇到此问题。

请注意,上面的错误消息引用了一个看似空格的意外标记。

由于我无法弄清楚这是什么,所以我花了很多时间考虑其他可能的深奥问题,例如 CORS、身份验证、混合来自 fetch API++ 的 Promises。

最佳答案

原因是 WCF REST 服务通过此调用创建响应:

return WebOperationContext.Current.CreateTextResponse(
    json, 
    "application/json; charset=utf-8", 
    Encoding.UTF8
);

事实证明,当 Microsoft 实现 Encoding.UTF8 编码时,他们选择在 json 字符串前面加上 UTF BOM 标记。结果是 JSON 左大括号前面有三个字符: 0xEF0xBB0xBF。在 ISO-8859-1 或 CP1252 中查看时,它们看起来像这样 

在这种情况下,我确实应该相信错误消息,但就在我开始添加身份验证的前一天,我收到其他人的报告,说 REST 服务确实正常工作。然后我开始添加迄今为止缺少的测试 - 同时还添加身份验证。正是在这个阶段,我意识到所有测试都失败了。而且 - 回溯并没有真正帮助......

作为旁注:当代码在浏览器中运行时,它似乎对 BOM 标记更加宽容。然而,当在节点中运行测试时,它似乎更加挑剔......

解决方案是强制关闭编码的 BOM 标记,如下所示:

// Note, false to avoid BOM marker which breaks some clients not expecting BOM for utf-8
var utf8 = new UTF8Encoding(false);
return WebOperationContext.Current.CreateTextResponse(
    json, 
    "application/json; charset=utf-8",
    utf8
);

关于javascript - 语法错误: Unexpected token in JSON at position 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42218393/

相关文章:

c# - 如何使用数据库 C# 中的值创建 ENUM

javascript - window.print() 位置 DIV 页面中心

javascript - 如何在 javascript 中编写参数大小的泛型函数?

javascript - 无法在尝试的验证函数中访问 javascript 父函数 - 可能需要关闭

java - 直接获取其他 json 对象中的特定嵌套 json 对象

java - 带有 JSON 的 Http 415 不支持的媒体类型错误

javascript - 如何在highcharts中设置动态数据

javascript - LIightBox2 数据标题描述链接与 JavaScript

javascript - 在嵌入式 C# 中传递 Javascript 变量

c# - 使用 Ninject 2 将参数传递给 WCF ServiceHost 类型