反序列化 MandrillApp Webhook 响应
Posted
技术标签:
【中文标题】反序列化 MandrillApp Webhook 响应【英文标题】:Deserializing MandrillApp Webhook response 【发布时间】:2014-08-22 15:59:30 【问题描述】: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);
例外
解析值时遇到意外字符:m。路径'',行 0,位置 0。
据我所知,我认为字符串的 mandrill_events=
部分无效。
【问题讨论】:
【参考方案1】: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 方式。
【讨论】:
谢谢。他们为什么要在字符串中包含它? 您需要反序列化为List<MandrillEvent>
,因为 JSON 是一个数组,而不是单个对象。
@BrianRogers:是的,我明白了。在我试图让它反序列化时,我创建了MandrillEvent
,它有一个属性mandrill_events
,它是一个WebHookEvent
的数组。但从表面上看,这确实不是问题。
@Despertar:我可以包含完整的字符串,但其余的似乎是有效的。
粘贴为 JSON 类 确实 听起来很棒。你能评论他们为什么会像他们一样发送回复吗?以上是关于反序列化 MandrillApp Webhook 响应的主要内容,如果未能解决你的问题,请参考以下文章
parse.com 云代码无法通过 mandrillapp 发送电子邮件