C# 反序列化MandrillApp Webhook响应

C# 反序列化MandrillApp Webhook响应,c#,json,json.net,mandrill,C#,Json,Json.net,Mandrill,MandrillappAPI应该发送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

MandrillappAPI应该发送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数据的类,但是反序列化程序抛出了一个错误

代码

m = JsonConvert.DeserializeObject<MandrillEvents>(s);
m=JsonConvert.DeserializeObject;
例外情况

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

据我所知,我认为字符串的
mandrill\u events=
部分无效

  • 该字符串是否可以反序列化
  • 反序列化时是否缺少一个选项
  • 我应该如何处理这个问题

mandrill\u events=
不是有效的JSON。如果你把它去掉,你应该能够解析它

string validJson = originalText.Replace("mandrill_events=", ""); 
var m = JsonConvert.DeserializeObject<MandrillEvents[]>(validJson);
如果您不确定是否可以使用

JArray array = JArray.Parse(validJson);
JToken token = JToken.Parse(validJson);
它对对象、数组和值都有效。我仍然认为反序列化到模型中更好,因为您可以得到强类型,但这至少可以确保您在尝试构建模型之前拥有有效的JSON


Visual Studio 2012有一个非常酷的功能,如果您复制有效的JSON文本,单击编辑>粘贴为JSON类,它实际上会将JSON粘贴为有效的C#类,然后您知道可以将其反序列化为。这使得从复杂的JSON构建POCO模型比手动构建要容易得多,也不容易出错


回答你的问题

你能评论一下为什么他们会像他们一样发送回复吗 有吗

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


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

谢谢。为什么要将其包含在字符串中?因为JSON是一个数组,而不是单个对象,所以需要反序列化到
列表中。@BrianRogers:是的,我知道了。为了让它反序列化,我创建了
MandrillEvent
,它有一个属性
mandrill\u events
,它是一个
WebHookEvent
数组。但从外观上看,这并不是问题所在。@Despertar:我可以包含完整的字符串,但其余的似乎是有效的。粘贴为JSON类听起来不错。你能评论一下为什么他们会像以前那样发送回复吗?