mandrill_events= 不是有效的 JSON。如果你把它拿出来,你应该能够解析它。
string validJson = originalText.Replace("mandrill_events=", "");
var m = JsonConvert.DeserializeObject<MandrillEvents[]>(validJson);
如果这不起作用,我们需要查看更多文本以确定还有哪些不是有效的 JSON。 JSON 很棒,因为它只有几个简单的数据类型。 Object、Array、Boolean、String、Integer 等。所有有效类型请参见 http://json.org/。
正如 Brian Rogers 所说,您还反序列化为错误的类型(您有一个对象数组,而不是单个对象)。
如果要检查整个 json 字符串是否有效,可以使用
JArray array = JArray.Parse(validJson);
如果您不确定是否可以使用
JToken token = JToken.Parse(validJson);
这适用于对象、数组和值。我仍然会说反序列化为模型会更好,因为您会获得强类型,但这至少可以确保您在尝试构建模型之前拥有有效的 JSON。
Visual Studio 2012 有一个非常酷的feature,如果您复制有效的 JSON 文本,请单击编辑 > 粘贴为 JSON 类,它实际上会将 JSON 粘贴为您可以使用的有效 C# 类然后知道你可以反序列化成。这使得从复杂的 JSON 构建 POCO 模型比手动构建更容易且更不容易出错。
回答您的问题
您能否评论他们为什么会像他们一样发送回复
有吗?
我认为这很奇怪,并且需要在客户端上做更多工作才能解析/读取他们的响应。您可以使用 JSON 表示几乎任何数据,这就是为什么它作为 Web API 的数据交换格式如此受欢迎的原因。所有现代语言也都有很好的 JSON 解析器。它是普遍的并且很好理解。当您想出任何自定义格式来发送需要客户端编写自己的解析器甚至使用正则表达式的数据时,那么您就是在重新发明轮子 IMO。在这种情况下,他们将一种格式嵌入到另一种格式中,这仍然很丑陋,并且会阻止您使用单个解析器。
至于为什么,它可能是为了向后兼容。他们最初将 API 公开为 application/x-www-form-urlencoded 并且不想破坏现有客户端,因此他们继续使用它但嵌入了 JSON 对象。从他们的文档(mandrillapp.com/api/docs/webhooks.JSON.html)中,看起来所有响应都是 JSON,您可以仔细检查您是否使用了正确的 url,并且您在请求中发送了 accept: application/json标题。这是告诉服务器您想要返回 JSON 响应的常见 HTTP 方式。