2017-10-28 49 views
1

我试图访问内部JSON消息数组元素,如下面示例JSON字符串中所示。在C中访问消息元素的内部嵌套JSON数组#

{"chats": 
[ 
//////////1ST CHAT 
{"type":"chat", 
"id":"OYTHUUBLB2", 
"tickets":[], 
"visitor_name":"Shen", 
"visitor_id":"value", 
"visitor_ip":"val", 
"visitor": 
      {"id":"", 
    "name":"Shen", 
    "email":"[email protected]", 
    "ip":"val", 
    "city":"Brampton", 
    "region":"Ontario", 
    "country":"Canada", 
    "country_code":"CA", 
    "timezone":"America/Rainy_River"}, 
"agents":[ 
    {"display_name":"Kim", 
    "email":"[email protected]", 
    "ip":"72."}, 
    ], 
"supervisors":[], 
    "rate":"not_rated", 
    "duration":213, 
    "chat_start_url":"httpsjj", 
    "group":[3], 
    "started":"Fri 10/27/17 01:12:38 pm", 
    "pending":false, 
"tags":[], 
"timezone":"America/Bogota", 
"messages":[ 
     { 
     "author_name":"Kim", 
     "text":"Hello Shenelle. How may I help you?", 
     "date":"Fri10/27/17 01:12:38 pm", 
     "timestamp":1509127958, 
     "agent_id":"val", 
     "user_type":"agent", 
     "type":"message", 
     "welcome_message":true, 
        } 
     {"author_name":"Shenelle", 
     "text":"I would like", 
     "date":"Fri 10/27/17 01:12:56 pm", 
     "timestamp":1509127976, 
     "user_type":"visitor", 
     "type":"message"}, 
       { 
     "author_name":"Shenelle", 
     "text":"helooooooooooooooooo", 
     "date":"Fri10/27/17 01:15:47 pm", 
     "timestamp":1509128147, 
     "user_type":"visitor", 
     "type":"message"}, 
        ] 

这是我已经在C#中尝试过。我可以访问其他元素,但它只是内嵌JSON消息数组是我的问题。任何人都可以帮助访问[text]元素的代码?我只想连接各个特定ChatIndex上[text]元素的所有迭代。我最终的结果是连接每个单独聊天的所有[文本]元素。

// JObject chatMessage = JObject.Parse(result); 
     dynamic chatMessage = JsonConvert.DeserializeObject(result); 


    int totalChats = (int)chatMessage["total"];//totalChats gives count of all individual chats 

     for(int chatIndex = 0; chatIndex < totalChats; chatIndex++) 
     { 
      string id = (string)chatMessage["chats"][chatIndex]["id"]; 
     string city = (string)chatMessage["chats"][chatIndex]["visitor"]["city"]; 
      string region = (string)chatMessage["chats"][chatIndex]["visitor"]["region"]; 
      string country = (string)chatMessage["chats"][chatIndex]["visitor"]["country"]; 
      string visitorName = (string)chatMessage["chats"][chatIndex]["visitor"]["name"]; 
      string visitorEmail = (string)chatMessage["chats"][chatIndex]["visitor"]["email"]; 

      Console.WriteLine("ID: "+id+ "\nVisitor Name: " +visitorName+ "\nVisitor Email:"+visitorEmail 
       + "\nVisitor City:"+ city + "\nVisitor Region:"+region +"\nCountry of visitor:"+ country); 

      // int messageIndex = chatMessage["chats"][chatIndex]["messages"].length; 
      // foreach (var messageIndex in chatMessage.messages) 
      // { 
      for (int messageIndex = 0; messageIndex < chatMessage["chats"][chatIndex]["messages"]; messageIndex++) { 

       // string msg = (string)chatMessage["chats"][chatIndex]["messages"][messageIndex]["author_name"]; 
      string text = (string)chatMessage["chats"][chatIndex]["messages"][messageIndex]["text"]; 
       // string.Concat(","+text); 
       Console.WriteLine("\n TEXT:"+text); 
          } 

      Console.WriteLine(""); //x++; 
     } 
+0

你知道有一些格式错误的JSON字符串?一些逗号(,)缺失 –

+0

@AryanFirouzyan我知道,我刚刚从原始json字符串复制了一段代码,试图让你们了解Messages元素是如何嵌套的。但我可以访问其他元素。它只是在代码中的内部循环来获取所有[文本]元素,我想连接它们 – ForzaC

+0

好吧,只需检查**消息的第二和第三项**值 –

回答

1
int messageNumber = chatMessage["chats"][chatIndex]["messages"].Count; 
      for (int i = 0; i < messageNumber; i++) 
      { 
       string text = (string)chatMessage["chats"][chatIndex]["messages"][i]["text"]; 
       Console.WriteLine(text); 
      } 

这解决了这个问题。必须获得这些上层嵌套元素。原来我所需要的所有代码是添加.​​Count聊天消息[“聊天”] [聊天索引] [“消息”]

2

使用Newtonsoft.Json后JsonConvert.DeserializeObject,在这里你可以通过嵌套项:

int messageNumber = chatMessage.messages.Count; 
for (int i = 0; i < messageNumber; i++) 
{ 
    Console.WriteLine(chatMessage.messages[i].text); 
} 
+0

它给出了错误:microsoft.csharp.runtimeBinder.RuntimeBinderException:无法执行运行时绑定空引用 – ForzaC

+0

所以奇怪的原因,当我把这个地方的内部循环字符串的地方文本=(字符串)chatMessage [“聊天”] [聊天索引] [ “消息”] [0] [ “文本”]; string text2 =(string)chatMessage [“聊天”] [chatIndex] [“messages”] [1] [“text”]; //Console.WriteLine("\n TEXT:“+ string.Concat(”,“+ text +','+ text2));它会打印出前两个元素,因为我想要它...但是我希望它能够在循环中工作 – ForzaC

+0

所以,这个问题可能就是我们如何获得长度或计数消息的方式。你能调试看看你是否正确地计算了消息的数量? –