2017-11-06 4 views
0

json.netとJArrayのの値を選択:次のように見えますカウントおよびIからC#で生成されたJSON配列持っている

var jArray = JArray.Parse(json); 

を:私はどのように知っておく必要があり

{[ 
{ 
    "tbxSocialContents_3": "test" 
}, 
{ 
    "txtSocialContentsImage_3": "C:\\fakepath\\photo.jpg" 
}, 
{ 
"txtSocialContentsImageValue_3": "photo.jpg" 
} 
]} 

配列の多くの要素には、テキストを含むプロパティがあり、result is > 1の場合はtxtSocialContentsImageValue_3の値を選択します。

私はこれをC#でどうやって行うことができますか?

+0

この変数には上記のtxtSocialContentsImageは含まれていません。どこでこれをしたいですか? HTML自体またはあなたのコードの背後にある?より良い期待結果を提供します。 –

+0

申し訳ありませんが、私は質問を編集しました。私はC#でそれが必要です。私は値を探していない、私はプロパティの名前を探しています。この例では、txtSocialContentsImageという文字列を持つ2つのプロパティ名があります。txtSocialContentsImage_3およびtxtSocialContentsImageValue_3 –

答えて

0

奇妙な方法は、キーと値のペアの配列として辞書を送信するが、ちょっと、誰が私は裁判官です。

投稿したJSONは配列ではありません。その生のJSONを読み取ろうとすると、Newtonsoft.Json.JsonReaderException: Error reading JArray from JsonReader. Current JsonReader item is not an array: StartObject例外が発生します。したがって、実際には正しいJSONを持っていて、先頭と末尾のスクイーズを削除すると仮定します。

これは動作するはずです:

 var jArray = JArray.Parse(json); 

     var matchedElements = jArray.Cast<JObject>().ToDictionary(item => item.Properties().FirstOrDefault().Name, item => item.Properties().FirstOrDefault().Value.Value<string>()); 

     if (matchedElements.Where(kv => kv.Key.Contains("txtSocialContentsImage")).Count() > 1 
      && matchedElements.Any(x => x.Key == "txtSocialContentsImageValue_3")) 
     { 
      return matchedElements["txtSocialContentsImageValue_3"]; 
     } 
+0

ありがとう@MikeMat、コードを使用して再生した後、その重要な部分を失った。 – zaitsman

+0

ありがとう@zaitsman。あなたの現在の答えが期待どおりの結果になります。ところで、「キーバリューペアの配列」は、特定のロジックを満たすクライアントで生成される文字列です。 –

0

あなたはこれを達成するためにLINQを使用することができるはずです。

string json = @"[{""tbxSocialContents_3"": ""test""},{""txtSocialContentsImage_3"": ""C:\\fakepath\\photo.jpg""},{""txtSocialContentsImageValue_3"": ""photo.jpg"",""txtSocialContentsImageValue_4"": ""photo2.jpg""}]"; 
     JArray arr = JArray.Parse(json); 
     var testVal = from a in arr 
      let sum = a.Children<JProperty>().Count(x => x.Name.Contains("txtSocialContentsImage")) 
      let names = a.Children<JProperty>().Where(x => x.Name.Contains("txtSocialContentsImage")) 
       .Select(x => x.Name) 
      select new {Count = sum, Names = sum > 1 ? names : null}; 

それを返します:

を[0]:{= 0をカウント、Names = null}
[1]:{Count = 1、Names = null}
[2] :{カウント= 2、名= {[0]: "txtSocialContentsImageValue_3"、[1]: "txtSocialContentsImageValue_4は"}}今

あなたは合計数を取得したり、同じようにそれらを保つためにすべての値を合計することができ、それです。

+0

ありがとう@Yatin。答えは役に立つかもしれませんが、私が期待していた具体的な結果は得られません。 –

関連する問題