c# - 反序列化 MandrillApp Webhook 响应

标签 c# json json.net mandrill

MandrillApp API 应该发送 JSON-encoded array of the messages使用 MIME 类型 application/x-www-form-urlencoded

我遇到的问题是收到的数据是这样的:

mandrill_events=%5B%7B%22event%22%3A%22send%22
%2C%22msg%22%3A%7B%22ts%22%3A136510999...etc

URL 解码为:

mandrill_events=[{"event":"send","msg":{
"ts":1365109999,"subject"...etc

我尝试将此字符串反序列化为表示 JSON 数据的类,但 JSON.NET反序列化器吐出一个错误。

代码

m = JsonConvert.DeserializeObject<MandrillEvents>(s);

异常

Unexpected character encountered while parsing value: m. Path '', line 0, position 0.

据我所知,我认为字符串的 mandrill_events= 部分无效。

  • 这个字符串应该能够被反序列化吗?
  • 反序列化时是否缺少一个选项?
  • 我应该如何处理这个问题?

最佳答案

mandrill_events= 不是有效的 JSON。如果你把它拿出来,你应该能够解析它。

string validJson = originalText.Replace("mandrill_events=", ""); 
var m = JsonConvert.DeserializeObject<MandrillEvents[]>(validJson);

如果这不起作用,我们将需要查看更多文本以确定还有哪些内容不是有效的 JSON。 JSON 很棒,因为它只有几种简单的数据类型。对象、数组、 bool 值、字符串、整数等。查看所有有效类型,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 模型比手动构建更容易且更不容易出错。


回答你的问题

Are you able to comment on why they would send the response like they have?

我认为这很奇怪,客户端需要做更多的工作才能解析/读取他们的响应。您几乎可以用 JSON 表示任何数据,这就是为什么它作为 Web API 的数据交换格式如此受欢迎的原因。所有现代语言也都有很好的 JSON 解析器。它是普遍的并且很好理解。当您提出任何自定义格式来发送需要客户端编写自己的解析器甚至使用正则表达式的数据时,您就是在重新发明轮子 IMO。在这种情况下,他们将一种格式嵌入到另一种格式中,这仍然非常难看,并且会阻止您使用单个解析器。

至于为什么,它可能是为了向后兼容。他们最初将 API 公开为 application/x-www-form-urlencoded 并且不想破坏现有客户端,因此他们继续使用它但嵌入了 JSON 对象。从他们的文档 (mandrillapp.com/api/docs/webhooks.JSON.html) 看来,所有响应都是 JSON,您可以仔细检查您是否使用了正确的 url 以及是否在请求中发送了 accept: application/json header 。这是告诉服务器您想要返回 JSON 响应的常见 HTTP 方式。

关于c# - 反序列化 MandrillApp Webhook 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24521326/

相关文章:

c# - 在XF Prism 7中不触发

android - 将 JSON String 转换为 JSON Array 并显示在 ListView 中

javascript - 在 JavaScript 中通过索引从对象数组中获取值?

c# - c# string 如何计算它自己的值?

C# BackgroundWorker 取消检查点缩短

c# - 如何将 HTTP 响应直接流式传输到网络

json - 从JSON创建CSV文件时Powershell脚本性能不佳

c# - 反序列化不同类型的JSON数组

c# - 当 DefaultValueHandling 为 Ignore 时,强制单个 JSON 属性始终序列化

c# - 如何根据 JTokenType 简化 JToken 的转换