反序列化 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 响应 的相关文章

  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 使用 Jade 评估自定义 javascript 方法 (CircularJSON)

    我想通过 Jade 将一个对象解析为客户端 JavaScript 通常这会起作用 script var object JSON parse JSON stringify object but my object is circular ht
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐