反序列化MandrillApp Webhook响应

时间:2014-07-02 00:51:57

标签: 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);

异常

  

解析值时遇到意外的字符:m。路径'',行   0,位置0。

根据我的观点,我认为字符串的mandrill_events=部分无效。

  • 该字符串是否可以反序列化?
  • 反序列化时是否有我缺少的选项?
  • 我该如何处理?

1 个答案:

答案 0 :(得分:6)

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文本,请单击编辑&gt; 粘贴为JSON类,它实际上会将JSON粘贴为有效的C#类,然后您可以将其反序列化。这使得从复杂的JSON构建POCO模型比手动操作更容易,更不容易出错。


回答你的问题

  

您是否能够评论他们为何会像他们一样发送回复   有?

我认为这很奇怪,并且会在客户端上投入更多工作来解析/阅读他们的回复。您可以使用JSON表示几乎所有数据,这就是为什么它是Web API的数据交换格式的流行选择。所有现代语言都有很好的JSON配对。它是普遍的,并且很好理解。当您想出任何自定义格式来发送需要客户端编写自己的解析器或甚至使用正则表达式的数据时,您就会重新发明轮子IMO。在这种情况下,他们将一种格式嵌入到另一种格式中,这仍然非常难看,并阻止您使用单个解析器。

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