質問
あるAPIのレスポンスがリスト2のような形になっています。
リスト1のような形であればforeach
できるのですが、
リスト2のような形の場合どのようにforeach
すれば良いでしょうか?
リスト2のJSONは必ず連番ではなく、飛び飛びの値がある場合もありました。
環境
- Windows
- .NET Framework 4.5.2
- C# 6.0
- NuGetから
Newtonsoft.Json
を利用しています。
プログラム
C#
1using System; 2using Newtonsoft.Json; 3 4namespace JsonTest 5{ 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 // リスト1のJSON 11 var strJson1 = @"{""results"":[{""val"":""x1""},{""val"":""x2""},{""val"":""x3""}]}"; 12 // リスト2のJSON 13 var strJson2 = @"{""results"": {""1"" : {""val"" : ""x1""},""2"" : {""val"" : ""x2""},""3"" : {""val"" : ""x3""}}}"; 14 15 var json1 = (dynamic)JsonConvert.DeserializeObject(strJson1); 16 var json2 = (dynamic)JsonConvert.DeserializeObject(strJson2); 17 18 foreach (var result in json1.results) 19 { 20 Console.WriteLine($"{result.val}"); 21 } 22 23 foreach (var result in json2.results) 24 { 25 Console.WriteLine($"{result.val}"); 26 } 27 } 28 } 29}
実行結果
x1 x2 x3 ハンドルされていない例外: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Newtonsoft.Json.Linq.JProperty' に 'val' の定義がありません 場所 CallSite.Target(Closure , CallSite , Object ) 場所 System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0) 場所 JsonTest.Program.Main(String[] args) 場所 D:\JsonTest\Program.cs:行 25 続行するには何かキーを押してください . . .
リスト1
JSON
1{ 2 "results": [ 3 { 4 "val" : "x1" 5 }, 6 { 7 "val" : "x2" 8 }, 9 { 10 "val" : "x3" 11 } 12 ] 13}
リスト2
JSON
1{ 2 "results": { 3 "1" : { 4 "val" : "x1" 5 }, 6 "2" : { 7 "val" : "x2" 8 }, 9 "3" : { 10 "val" : "x3" 11 } 12 } 13}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/24 09:22