Office365 由于无效字符,无法从图形API反序列化错误响应

Office365 由于无效字符,无法从图形API反序列化错误响应,office365,office365api,microsoft-graph-api,Office365,Office365api,Microsoft Graph Api,下面是我从Graph API得到的错误响应 { “错误”:{ “代码”:“ErrorItemNotFound”, “消息”:“在存储中找不到指定的对象。”, “内部错误”:{ “请求id”:“c2b32b83-5ccf-4385-bee1-33afcc31deb0”, “日期”:“2016-07-25T00:25:16” } } } 当我试图将响应反序列化为我自己的错误对象时,我得到了一个错误 分析值时遇到意外字符:。路径“”,第行 0,位置0 复制上面的JSON并尝试使用此工具进行验证 还有

下面是我从Graph API得到的错误响应

{ “错误”:{ “代码”:“ErrorItemNotFound”, “消息”:“在存储中找不到指定的对象。”, “内部错误”:{ “请求id”:“c2b32b83-5ccf-4385-bee1-33afcc31deb0”, “日期”:“2016-07-25T00:25:16” } } }

当我试图将响应反序列化为我自己的错误对象时,我得到了一个错误

分析值时遇到意外字符:。路径“”,第行 0,位置0

复制上面的JSON并尝试使用此工具进行验证

还有其他人有同样的问题吗


更新

抱歉反应太晚了。下面是我正在使用的确切代码。我刚刚再次测试了这个,我得到了同样的错误

Enpoint URL:

请求正文

{"Id":null,"Subject":"Maths","UserEmailAddress":"sample@sample.onmicrosoft.com","Start":{"DateTime":"2016-09-1T10:11:56","TimeZone":"Pacific/Auckland"},"End":{"DateTime":"2016-09-1T11:11:56","TimeZone":"Pacific/Auckland"},"Location":null,"Body":null,"ReminderMinutesBeforeStart":60,"IsReminderOn":true}

您发布的JSON文本实际上包含3字节UTF-8 BOM(0xEF 0xBB 0xBF)。这将导致大多数JSON解析器失败

解决问题的一个简单方法是在解析之前检测BOM并将其剥离

假设使用JavaScript,下面类似的内容将解决您眼前的问题

<!-- language: lang-js -->
// Reading the string into JavaScript will convert the BOM from the 3-byte
// version to the 2-byte version (0xFEFF).
json = json.replace(/^\uFEFF/, '');

//将字符串读入JavaScript将转换3字节的BOM表
//版本转换为2字节版本(0xFEFF)。
json=json.replace(/^\uFEFF/,“”);
-

更多


首先要弄清楚为什么这会附加到产生的错误中,这会更有价值。您是如何提出导致此错误的请求的?如果这是来自网页,那么网页编码是什么?您是否正在设置与所需编码相关的任何其他HTTP请求头?

您好,感谢您试用Microsoft Graph。你介意分享更多关于这个问题的信息吗?您正在尝试访问哪个端点?你能和我们分享这个请求吗?正如你已经做的那样,上面提到的错误负载似乎是有效的JSON。您是否正在使用客户端SDK(如果是,是什么平台?)?如果没有,您将使用哪个库来反序列化JSON负载?能否提供反序列化代码的示例?JSON本身是有效的,非常好。我从上面复制并粘贴了JSON,但在这个过程中,我显然错过了BOM表。除非如您所述,REST端点的调用方式有一些独特之处,否则这里显然存在一个bug。BOM不应包含在JSON有效负载中;RFC 7159明确提到:也被这个错误咬了一口,使用Node.js服务器,让它根据内容类型application/json自动解析响应,但在试图破解graph API调用不起作用的原因时,不断出现json解析错误。这真是令人沮丧的调试尝试,请修复错误JSON是有效的!
<!-- language: lang-js -->
// Reading the string into JavaScript will convert the BOM from the 3-byte
// version to the 2-byte version (0xFEFF).
json = json.replace(/^\uFEFF/, '');