2013-06-14 2 views
3

Типичный набор заголовков сообщений из mailgun обратного вызова выглядит следующим образом:Как разобрать JSON массив из заголовков сообщений с Mailgun webhook

[["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 <[email protected]>"], 
["To", "Test Receiver <[email protected]>"], 
["Reply-To", "[email protected]"], 
["Message-Id", "<[email protected]>"], 
["X-Mailgun-Sid", "WyIzOTUwOCIsICJuZWlsLmRvYnNvbkBleGFsdGdyb3VwLmNvbS5hdSIsICI4ZjY3OCJd"], 
["Date", "Fri, 14 Jun 2013 02:25:33 +0000"], 
["Sender", "[email protected]"]] 

Я предположил, что это будет десериализацией в список ключей паров/значения, но я «Мне не удалось это сделать. Очевидно, что элемент Content-Type более сложный.

Может ли кто-нибудь помочь разобрать это на список или poco с помощью ServiceStack или встроенных NET-десериализаторов?

ответ

3

Прискорбно, что сторонний API возвращает JSON в [["key", "value"], ...] массиве, а не {"key:" value ", ...}. гораздо проще разобрать в обычный класс, как это:.

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

путь возвращает это анонимный список значений, содержащий более анонимные списки, где 0 значение ключа и значение 1 является значением

Я не пробовал, но вы можете попробовать десериализацию динамического списка анонимных типов, за this SO answer

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

Для удобства вы можете написать процедуру сопоставления, чтобы скопировать jsonObject в более читаемый класс.

Обновление: я написал немного кода для тестирования. Не так уж и красиво, но он работает для доступа к анализируемому JSON as-is.

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 <[email protected]>""], 
[""To"", ""Test Receiver <[email protected]>""], 
[""Reply-To"", ""[email protected]""], 
[""Message-Id"", ""<[email protected]>""], 
[""X-Mailgun-Sid"", ""WyIzOTUwOCIsICJuZWlsLmRvYnNvbkBleGFsdGdyb3VwLmNvbS5hdSIsICI4ZjY3OCJd""], 
[""Date"", ""Fri, 14 Jun 2013 02:25:33 +0000""], 
[""Sender"", ""[email protected]""]]"; 

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)); 
Смежные вопросы