代码之家  ›  专栏  ›  技术社区  ›  Adam

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

  •  1
  • Adam  · 技术社区  · 7 年前

    我正在尝试反序列化Live Chat API JSON响应,以通过使用用户类型筛选来访问消息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"
        }
      ]
    }}
    

    JSONoCube类

    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; }
            }
    
    
        }
    

    JSON变换器

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

    ChatEvent对象不允许我调用 chatEvent.events.message_id 例如。如果有任何帮助,我将不胜感激,因为这是我第一次在C语言中使用JSON。#

    3 回复  |  直到 7 年前
        1
  •  0
  •   Anupam Singh    7 年前

    与JSON无关,您已经将JSON数据解析回 Rootobject . 现在您使用的是 罗布托普 AS:

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

    另外,考虑一下Mohammad的答案,因为上面的JSON将抛出一个异常。

        2
  •  0
  •   Mohammad Karimi    7 年前

    这里的主要问题是您的JSON无效,有一个额外的 { 在开始和一个额外的 } 最后。 然后您可以用您提供的类型反序列化您的JSON。

        3
  •  0
  •   er-sho    7 年前

    您的JSON包含多个那一个花括号,因此您必须首先删除那些花括号。

    所以你的JSON看起来像

    < PRE> >代码> “事件”: { “type”:“代理程序详细信息”, “message_id”:1, “时间戳”:1532396384, “user_type”:“代理”, “代理”:{ “name”:“亚当·哈里斯”, “job_title”:“支持代理”, “avatar”:“livechat.s3.amazonaws.com/default/avatars/ab5b0666feffd7600206cd519fd77ea.jpg” } } { “type”:“消息”, “message_id”:3, “时间戳”:1532396387, “user_type”:“访客”, “文本”:“嗨” } ] } < /代码>

    之后,您必须根据用户类型收集消息ID

    然后我们为它创建枚举

    公共枚举用户类型
    {
    代理人、来访者
    }
    < /代码> 
    
    

    然后,我们简单地签入事件,如果用户类型与上述枚举值中的任何一个匹配,则返回该事件。

    如果JSON包含多个具有多个用户类型的事件,则将这些事件收集到list<int>

    如果JSON只包含每种用户类型的单个事件,则将其收集到stringvariables.

    rootObject chateEvent=jsonConvert.DeserializeObject<rootObject>(jsonStr);
    
    list<int>代理程序_message_id=new list<int>();
    list<int>visitior_message_ids=新列表<int>();
    
    //string agent_message_id=string.empty;
    //字符串visitior_message_id=string.empty;
    
    foreach(chateevent.events中的事件e)
    {
    if(e.user_type==usertype.agent.toString())
    {
    agent_message_id.add(e.message_id);
    //agent_message_id=e.message_id;
    }
    
    if(e.user_type==usertype.visitor.toString())
    {
    visitior_message_id.add(e.message_id);
    //visitior_message_id=e.message_id;
    }
    
    }
    < /代码> 
    
    

    我们只需要一个整数列表来存储特定用户类型的消息ID

    试一下,可以吗

    结果:

    代理\消息\ ID:。

    访客信息:

    之后,您必须根据用户类型收集消息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;
                    }
    
                }
    

    我们只需要一个整数列表来存储特定用户类型的消息ID

    试一下,可以吗

    结果:

    代理程序消息ID:

    enter image description here

    访客信息标识:

    enter image description here