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响应的常见方式。