4

mailgun コールバックからのメッセージ ヘッダーの典型的なセットは次のようになります。

[["Received", "by luna.mailgun.net with SMTP mgrt 8765806286401; Fri, 14 Jun 2013 02:25:33 +0000"],
["Content-Type", ["multipart/mixed", {"boundary": "199d7350597e43c0af0e4c814b8a35af"}]],    
["Mime-Version", "1.0"], 
["Subject", "Test Message"],
["From", "Test Sender <sender@mydomain.com>"],
["To", "Test Receiver <receiver1@mydomain.com>"],
["Reply-To", "replyto@mydomain.com"], 
["Message-Id", "<20130614022533.18419.66130@mydomain.com>"], 
["X-Mailgun-Sid", "WyIzOTUwOCIsICJuZWlsLmRvYnNvbkBleGFsdGdyb3VwLmNvbS5hdSIsICI4ZjY3OCJd"], 
["Date", "Fri, 14 Jun 2013 02:25:33 +0000"], 
["Sender", "sender@mydomain.com"]]

これはキーと値のペアのリストに逆シリアル化されると思いましたが、これを機能させることができません。明らかに、Content-Type 項目はより複雑です。

ServiceStackまたは組み込みのNETデシリアライザーを使用して、これをリストまたはpocoに解析するのを手伝ってくれる人はいますか?

4

1 に答える 1

3

残念なことに、サードパーティ API は、{"key:"value", ...} ではなく [["key","value"],...] 配列で JSON を返します。後者の方が解析がはるかに簡単です。次のような典型的なクラスに:

public class Foo
{
    public string Received {get; set;}
    [DataMember(Name = "Content-Type")]
    public string ContentType {get; set;}
    ... 
}

それが返す方法は、0 値がキーで 1 値が値である、より多くの匿名リストを含む値の匿名リストです。

私は試していませんが、このSOの回答に従って、匿名型の動的リストに逆シリアル化してみてください

List<JsonObject> jsonObject = JsonArrayObjects.Parse(json);
jsonObject.PrintDump(); // show data

次に、便宜上、jsonObject をより読みやすいクラスにコピーするマッピング ルーチンを作成できます。

更新: テストするコードを少し書きました。それほどきれいではありませんが、解析された JSON にそのままアクセスすることはできます。

string json = @"[[""Received"", ""by luna.mailgun.net with SMTP mgrt 8765806286401; Fri, 14 Jun 2013 02:25:33 +0000""],
[""Content-Type"", [""multipart/mixed"", {""boundary"": ""199d7350597e43c0af0e4c814b8a35af""}]],    
[""Mime-Version"", ""1.0""], 
[""Subject"", ""Test Message""],
[""From"", ""Test Sender <sender@mydomain.com>""],
[""To"", ""Test Receiver <receiver1@mydomain.com>""],
[""Reply-To"", ""replyto@mydomain.com""], 
[""Message-Id"", ""<20130614022533.18419.66130@mydomain.com>""], 
[""X-Mailgun-Sid"", ""WyIzOTUwOCIsICJuZWlsLmRvYnNvbkBleGFsdGdyb3VwLmNvbS5hdSIsICI4ZjY3OCJd""], 
[""Date"", ""Fri, 14 Jun 2013 02:25:33 +0000""], 
[""Sender"", ""sender@mydomain.com""]]";

List<JsonObject> jsonObject = JsonArrayObjects.Parse(json);
// jsonObject.PrintDump(); // show data

string received = jsonObject[0].Values.First();
string contentType = jsonObject[1].Values.First();
List<JsonObject> contentTypeValues = JsonArrayObjects.Parse(jsonObject[1].Values.First());
string boundary = contentTypeValues[1].Values.First();
string mimeVersion = jsonObject[2].Values.First();

Console.WriteLine(string.Format("received: {0}", received));
Console.WriteLine(string.Format("contentType: {0}", contentType));
Console.WriteLine(string.Format("boundary: {0}", boundary));
Console.WriteLine(string.Format("mimeVersion: {0}", mimeVersion));
于 2013-06-14T11:43:01.417 に答える