2017-10-28 21 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]要素のすべての反復を連結したいだけです。私の最終的な結果は、個々のチャットのすべての[テキスト]要素を連結することです。 Newtonsoft.Jsonを使用して

// 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 stringに何らかのフォーマットエラーがありますか?いくつかのコンマ(、)がありません –

+0

@AryanFirouzyan私は元のJSON文字列からスニペットをコピーして、メッセージ要素がどのようにネストされているかを理解できるようにしました。しかし、私は他の要素にアクセスすることができます。コード内のすべての[text]要素を取得するための内部ループとそれらをconcatしたい – ForzaC

+0

**メッセージの2番目と3番目の項目をチェック**値 –

答えて

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

これは、問題を解決しました。それらの上位入れ子要素を適所に持っていなければならなかった。私のオリジナルコードで必要なのは、chatMessage ["chats"] [chatIndex] ["messages"]に追加することでした。

2

後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:null参照でランタイムバインディングを実行できません – ForzaC

+0

この内部ループの代わりにこの場所を配置すると奇妙な原因になりますstring text =(string)chatMessage ["chats"] [chatIndex ] ["messages"] [0] ["text"]; 文字列text2 =(文字列)chatMessage ["chats"] [chatIndex] ["messages"] [1] ["text"]; //Console.WriteLine("\n TEXT: "+ string.Concat("、+ text + '、' + text2));最初の2つの要素を連結して印刷しますが、ループしてもかまいません。 – ForzaC

+0

問題はおそらく長さやカウントメッセージの取得方法です。あなたが正しくメッセージ数をカウントするかどうかをデバッグできますか? –

関連する問題