反序列化 MandrillApp Webhook 响应

2023-12-04

MandrillApp API 据称会发送一个JSON 编码的消息数组与哑剧类型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解串器输出错误。

Code

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

例外

解析值时遇到意外字符:m。路径'',行 0,位置 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 有一个非常酷的功能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 方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反序列化 MandrillApp Webhook 响应 的相关文章

随机推荐