反序列化MandrillApp Webhook响应



MandrillApp API应该发送一个json编码的消息数组,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. Path ", line0,位置0

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

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

mandrill_events=是无效的JSON。如果你把它拿出来,你应该可以解析它。

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

如果这不起作用,我们需要查看更多的文本来确定还有哪些是无效的JSON。JSON很棒,因为它只有几个简单的数据类型。对象,数组,布尔值,字符串,整数等。查看所有有效类型,http://json.org/.

正如Brian Rogers所提到的,您还反序列化为错误的类型(您有一个对象数组,而不是单个对象)。

如果你想检查整个json字符串是否有效,你可以使用

JArray array = JArray.Parse(validJson);

如果你不确定,你可以使用

JToken token = JToken.Parse(validJson);

同时作用于对象、数组和值。我仍然认为反序列化到模型中更好,因为您可以获得强类型,但这至少可以确保在尝试构建模型之前拥有有效的JSON。


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


回答你的问题

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

我认为这是奇怪的,把更多的工作放在客户端能够解析/读取他们的响应。你几乎可以用JSON表示任何数据,这就是为什么它作为web API的数据交换格式是如此流行的选择。所有现代语言都有很好的JSON伙伴。这是普遍的,很容易理解的。当你想出任何自定义格式来发送数据,要求客户端编写自己的解析器甚至使用正则表达式,那么你是在重新发明轮子在我看来。在这种情况下,他们将一种格式嵌入到另一种格式中,这仍然非常丑陋,并且阻止您使用单个解析器。

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

相关内容

  • 没有找到相关文章