反序列化json多个数组

时间:2015-11-10 15:39:21

标签: c# json json.net json-deserialization

我一直在墙上打了好几天。

有人可以告诉我如何反序列化吗?我可以反序列化单个json,但反序列化数组让我感到难过。

 [
  {
    "msys": {
      "message_event": {
        "type": "bounce",
        "bounce_class": "1",
        "campaign_id": "Example Campaign Name",
        "customer_id": "1",
        "delv_method": "esmtp",
        "device_token": "45c19189783f867973f6e6a5cca60061ffe4fa77c547150563a1192fa9847f8a",
        "error_code": "554",
        "ip_address": "127.0.0.1",
        "message_id": "0e0d94b7-9085-4e3c-ab30-e3f2cd9c273e",
        "msg_from": "sender@example.com",
        "msg_size": "1337",
        "num_retries": "2",
        "rcpt_meta": {
          "customKey": "customValue"
        },
        "rcpt_tags": [
          "male",
          "US"
        ],
        "rcpt_to": "recipient@example.com",
        "rcpt_type": "cc",
        "raw_reason": "MAIL REFUSED - IP (17.99.99.99) is in black list",
        "reason": "MAIL REFUSED - IP (a.b.c.d) is in black list",
        "routing_domain": "example.com",
        "subject": "Summer deals are here!",
        "template_id": "templ-1234",
        "template_version": "1",
        "timestamp": 1427736822,
        "transmission_id": "65832150921904138"
      }
    }
  }
]

我的课程定义为:

public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public Msys msys { get; set; }
}

public class Msys
{
    public Message_Event message_event { get; set; }
}

public class Message_Event
{
    public string type { get; set; }
    public string bounce_class { get; set; }
    public string campaign_id { get; set; }
    public string customer_id { get; set; }
    public string delv_method { get; set; }
    public string device_token { get; set; }
    public string error_code { get; set; }
    public string ip_address { get; set; }
    public string message_id { get; set; }
    public string msg_from { get; set; }
    public string msg_size { get; set; }
    public string num_retries { get; set; }
    public Rcpt_Meta rcpt_meta { get; set; }
    public string[] rcpt_tags { get; set; }
    public string rcpt_to { get; set; }
    public string rcpt_type { get; set; }
    public string raw_reason { get; set; }
    public string reason { get; set; }
    public string routing_domain { get; set; }
    public string subject { get; set; }
    public string template_id { get; set; }
    public string template_version { get; set; }
    public int timestamp { get; set; }
    public string transmission_id { get; set; }
}

public class Rcpt_Meta
{
    public string customKey { get; set; }
}

4 个答案:

答案 0 :(得分:0)

尝试反序列化为List<Class1>

var list = JsonConvert.DeserializeObject<List<Class1>>(json);

foreach (Message_Event msg in list.Select(c => c.msys.message_event))
{
    Console.WriteLine("campaign: " + msg.campaign_id);
    Console.WriteLine("from: " + msg.msg_from);
    Console.WriteLine("to: " + msg.rcpt_to);
    // etc.
}

小提琴:https://dotnetfiddle.net/Ei0apw

答案 1 :(得分:0)

在我的情况下,这是有效的。你需要告诉Newtonsoft.Json你的目的地类型是什么(array = list):

var des = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Class1>>(json);

这是一个简单的完整示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NewtonSoftSample
{
    class Program
    {
        static void Main(string[] args)
        {
            string json =
@"
[
  {
    ""msys"": {
      ""message_event"": {
        ""type"": ""bounce"",
        ""bounce_class"": ""1"",
        ""campaign_id"": ""Example Campaign Name"",
        ""customer_id"": ""1"",
        ""delv_method"": ""esmtp"",
        ""device_token"": ""45c19189783f867973f6e6a5cca60061ffe4fa77c547150563a1192fa9847f8a"",
        ""error_code"": ""554"",
        ""ip_address"": ""127.0.0.1"",
        ""message_id"": ""0e0d94b7-9085-4e3c-ab30-e3f2cd9c273e"",
        ""msg_from"": ""sender@example.com"",
        ""msg_size"": ""1337"",
        ""num_retries"": ""2"",
        ""rcpt_meta"": {
          ""customKey"": ""customValue""
        },
        ""rcpt_tags"": [
          ""male"",
          ""US""
        ],
        ""rcpt_to"": ""recipient@example.com"",
        ""rcpt_type"": ""cc"",
        ""raw_reason"": ""MAIL REFUSED - IP (17.99.99.99) is in black list"",
        ""reason"": ""MAIL REFUSED - IP (a.b.c.d) is in black list"",
        ""routing_domain"": ""example.com"",
        ""subject"": ""Summer deals are here!"",
        ""template_id"": ""templ-1234"",
        ""template_version"": ""1"",
        ""timestamp"": 1427736822,
        ""transmission_id"": ""65832150921904138""
      }
    }
  }
]
";

            var des = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Class1>>(json);

            Console.WriteLine("Done");

            Console.ReadLine();

        }
    }

    public class Rootobject
    {
        public Class1[] Property1 { get; set; }
    }

    public class Class1
    {
        public Msys msys { get; set; }
    }

    public class Msys
    {
        public Message_Event message_event { get; set; }
    }

    public class Message_Event
    {
        public string type { get; set; }
        public string bounce_class { get; set; }
        public string campaign_id { get; set; }
        public string customer_id { get; set; }
        public string delv_method { get; set; }
        public string device_token { get; set; }
        public string error_code { get; set; }
        public string ip_address { get; set; }
        public string message_id { get; set; }
        public string msg_from { get; set; }
        public string msg_size { get; set; }
        public string num_retries { get; set; }
        public Rcpt_Meta rcpt_meta { get; set; }
        public string[] rcpt_tags { get; set; }
        public string rcpt_to { get; set; }
        public string rcpt_type { get; set; }
        public string raw_reason { get; set; }
        public string reason { get; set; }
        public string routing_domain { get; set; }
        public string subject { get; set; }
        public string template_id { get; set; }
        public string template_version { get; set; }
        public int timestamp { get; set; }
        public string transmission_id { get; set; }
    }

    public class Rcpt_Meta
    {
        public string customKey { get; set; }
    }
}

答案 2 :(得分:0)

你的方法错了。您希望不知道json包含哪些字段,但只知道它将是可以解析的有效json对象。

我首先建议您了解json对象到底是什么以及它可以从中组成什么。你可以阅读它here

接下来,您可以使用this作为json解析器。 有关使用的文档可以在here找到。

答案 3 :(得分:-1)

您可以使用:

public class Msys
{
    public List<Message_Event> message_event { get; set; }  
}

并初始化您的列表&lt;&gt;与

System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Message_Event>(json);