在C#中使用嵌套列表反序列化JSON数组对象

时间:2018-07-24 07:28:10

标签: c# json

我正在尝试反序列化实时聊天API json响应,以通过使用user_type进行过滤来访问消息ID和文本

JSON响应

{{
  "events": [
    {
      "type": "agent_details",
      "message_id": 1,
      "timestamp": 1532396384,
      "user_type": "agent",
      "agent": {
        "name": "Adam Harris",
        "job_title": "Support Agent",
        "avatar": "livechat.s3.amazonaws.com/default/avatars/ab5b0666feffd67600206cd519fd77ea.jpg"
      }
    },
    {
      "type": "message",
      "message_id": 3,
      "timestamp": 1532396387,
      "user_type": "visitor",
      "text": "hi"
    }
  ]
}}

JsonOject类

class JsonLiveChatEvent
    {


        public class Rootobject
        {
            public Event[] events { get; set; }
        }

        public class Event
        {
            public string type { get; set; }
            public int message_id { get; set; }
            public int timestamp { get; set; }
            public string user_type { get; set; }
            public Agent agent { get; set; }
            public string text { get; set; }
        }

        public class Agent
        {
            public string name { get; set; }
            public string job_title { get; set; }
            public string avatar { get; set; }
        }


    }

JsonConverter

string jsonStr= await Api.Chat.GetPendingMessages(visitorID, licenseID, 
var chatEvent = JsonConvert.DeserializeObject<Rootobject>(jsonStr);

例如,chatEvent对象不会让我调用chatEvent.events.message_id。任何帮助将不胜感激,因为这是我第一次在c#中使用json

3 个答案:

答案 0 :(得分:0)

这里的主要问题是您的json无效,开头有一个额外的{,在结尾有一个额外的}。 然后,您可以使用提供的类型反序列化json

答案 1 :(得分:0)

与JSON无关,您已将JSON数据解析回Rootobject。 现在,您以以下方式使用Rootobject的实例:

Rootobject chatEvent = JsonConvert.DeserializeObject<Rootobject>(jsonStr);
Event event1 = chatEvent.events[0];
Event event2 = chatEvent.events[1];

还要考虑来自穆罕默德的答案,因为上述JSON会引发异常。

答案 2 :(得分:0)

您的json包含多个大括号,因此您必须先删除这些大括号

所以您的json看起来像

{
  "events": [
    {
      "type": "agent_details",
      "message_id": 1,
      "timestamp": 1532396384,
      "user_type": "agent",
      "agent": {
        "name": "Adam Harris",
        "job_title": "Support Agent",
        "avatar": "livechat.s3.amazonaws.com/default/avatars/ab5b0666feffd67600206cd519fd77ea.jpg"
      }
    },
    {
      "type": "message",
      "message_id": 3,
      "timestamp": 1532396387,
      "user_type": "visitor",
      "text": "hi"
    }
  ]
}

此后,您必须根据user_type收集消息ID

然后我们为此创建枚举

public enum UserType
        {
            agent, visitor
        }

然后,我们仅检查用户类型是否与上述枚举值中的任何一个匹配的事件。

如果您的json包含具有多种用户类型的多个事件,则将其收集到List<int>中。

如果您的json仅包含每种用户类型的单个事件,则将它们收集到string变量中。

Rootobject chatEvent = JsonConvert.DeserializeObject<Rootobject>(jsonStr);

            List<int> agent_message_ids = new List<int>();
            List<int> visitior_message_ids = new List<int>();

            //string agent_message_id = string.Empty;
            //string visitior_message_id = string.Empty;

            foreach (Event e in chatEvent.events)
            {
                if (e.user_type == UserType.agent.ToString())
                {
                    agent_message_ids.Add(e.message_id);
                    //agent_message_id = e.message_id;
                }

                if (e.user_type == UserType.visitor.ToString())
                {
                    visitior_message_ids.Add(e.message_id);
                    //visitior_message_id  = e.message_id;
                }

            }

我们只需获取存储特定user_type的消息ID的整数列表

尝试一次可能对您有帮助

结果:

agent_message_ids:

enter image description here

visitor_message_ids:

enter image description here