こんにちは。
Windows10でアプリケーションを開発しています。
Visual Studio 2015 Communityを使っています。
###前提・実現したいこと
NewtonSoft.Json.dllを使ってJsonをDeserializeして、個々の要素を取り出したいです。
###試したこと
{
"ClassA": [
{
"aaa": {
"name": "paseri",
"result": false
},
"bbb": {
"name": "neroli",
"result": true
},
"ccc": {
"name": "gloom",
"paramater": {
"array": [ "a", "b", "c" ],
"name": "bobtail"
},
"result": true
}
}
]
}
のようなjsonをパースして、aaa,bbb,cccをforeachして、paramaterの項目を持つ場合のarrayの要素をとりだしたいです。
###該当のソースコード
C#
1string jsonstring = File.ReadAllText(filepath, Encoding.UTF8); 2var obj = JsonConvert.DeserializeObject(jsonstring);
で、objに入れることはできたのですが、それをどう扱ったらよいかわからず、途方に暮れています。
C#
1foreach(? childobj in obj){ 2 if(childobj.Children.Key.Contains("array")) 3 Console.Write(childobj.Children.Value); 4}
みたいなイメージで取り出したいです。
###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2015
Version 14.0.25424.00 Update 3
Microsoft .NET Framework
Version 4.6.01038
インストールしているバージョン:Community
Visual C# 2015 00322-20000-00000-AA575
Microsoft Visual C# 2015
です。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答5件
1
amay077 さんの回答のコメントに書きましたが、そう言っておいてできないと何なので実際にコードを書いて検証して見ました。
JSON 文字列が最初の質問のように以下の通りであれば、
{ "ClassA": [ { "aaa": { "name": "paseri", "result": false }, "bbb": { "name": "neroli", "result": true }, "ccc": { "name": "gloom", "paramater": { "array": [ "a", "b", "c" ], "name": "bobtail" }, "result": true } } ] }
amay077 さんが紹介されたサイトで上記 JSON 文字列からクラス定義を作成し、それをそのままソースに貼り付けて、DeserializeObject<RootObject> メソッドを使って、RootObject オブジェクトを取得できます。
RootObject オブジェクトを取得できれば、そのクラス定義にあるプロパティを使って値を取得できます。以下のような感じです(コンソールアプリです)。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonsoft.Json; namespace JsonNETSample { class Program { static void Main(string[] args) { string filepath = @"C:\...\JsonSample.txt"; string jsonString = System.IO.File.ReadAllText(filepath, Encoding.UTF8); RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(jsonString); foreach (ClassA classA in rootObject.ClassA) { Aaa aaa = classA.aaa; Bbb bbb = classA.bbb; Ccc ccc = classA.ccc; Paramater param = ccc.paramater; List<string> array = param.array; string paramName = param.name; Console.WriteLine("aaa.name: {0}, aaa.result: {1}", aaa.name, aaa.result); Console.WriteLine("bbb.name: {0}, bbb.result: {1}", bbb.name, bbb.result); Console.WriteLine("ccc.name: {0}, ccc.result: {1}", ccc.name, ccc.result); Console.Write(" ccc.paramater, array: "); foreach (string s in array) { Console.Write("{0}, ", s); } Console.Write(", name: {0}\n", param.name); } /* 結果は: aaa.name: paseri, aaa.result: False bbb.name: neroli, bbb.result: True ccc.name: gloom, ccc.result: True ccc.paramater, array: a, b, c, , name: bobtail */ } } // 以下のサイトで JSON 文字列からクラス定義を自動生成 // json2csharp - generate c# classes from json // http://json2csharp.com/ public class Aaa { public string name { get; set; } public bool result { get; set; } } public class Bbb { public string name { get; set; } public bool result { get; set; } } public class Paramater { public List<string> array { get; set; } public string name { get; set; } } public class Ccc { public string name { get; set; } public Paramater paramater { get; set; } public bool result { get; set; } } public class ClassA { public Aaa aaa { get; set; } public Bbb bbb { get; set; } public Ccc ccc { get; set; } } public class RootObject { public List<ClassA> ClassA { get; set; } } }
でも、最初に JSON 文字列ありきで、それからクラス定義を作成し、そのクラス定義に合わせてコードを書くというのは、そもそも順番が違うような気がしますが・・・
投稿2016/09/24 05:34
総合スコア17941
0
質問者さんのイメージに近い感じはこんなのかな。
csharp
1 2var properties = ((JObject)obj).Descendants().OfType<JProperty>(); 3foreach (var prop in properties) 4{ 5 if (prop.Name == "array") 6 { 7 var arr = prop.Value.ToObject<string[]>(); 8 Console.WriteLine(string.Join(", ", arr)); 9 } 10}
投稿2016/09/24 07:46
総合スコア10
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
0
JSONを見る限り、ClassA自体もPropertyで定義する必要があるんじゃないかと思われます。
そして、ClassAは配列でIndex:0にaaa、bbb、cccのプロパティがあるイメージです。
もしかしたら、私のやり方が常套手段ではないかもしれませんが、配列の場合はList<T>で定義しています。
なので、aaa,bbb,cccのプロパティを持っているClass(ex:Class_A)を定義して、そのクラスのListをClassA(ex:public List<Class_A> ClassA{})として定義する必要があります。
SurferOnWwwさんと大して変わりませんが、aaa・bbbとcccが同じような意味であれば下記のような定義もありかと思います。
C#
1public class TestData 2{ 3 public class Class_A 4 { 5 public class Detail 6 { 7 public class Para 8 { 9 public List<string> array 10 { 11 get; set; 12 } 13 public string name 14 { 15 get; set; 16 } 17 } 18 public string name 19 { 20 get; set; 21 } 22 public bool result 23 { 24 get; set; 25 } 26 public Para paramater 27 { 28 get; set; 29 } 30 } 31 public Detail aaa 32 { 33 get; set; 34 } 35 public Detail bbb 36 { 37 get; set; 38 } 39 public Detail ccc 40 { 41 get; set; 42 } 43 } 44 public List<Class_A> ClassA 45 { 46 get; set; 47 } 48}
DeserializeObjectは他の方の通り<>の中にクラス名を定義するか、varではなくクラス名を明示する必要があります。
投稿2016/09/24 06:51
編集2016/09/24 07:48総合スコア202
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
0
は便利ですよ。
JSONの文字列から、C# のクラスを作ってくれます。
少し加工が必要になるでしょうが、自力で作るよりはずいぶんと楽ができます。
投稿2016/09/23 07:05
総合スコア1075
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
2016/09/24 04:21
0
まず、落ち着いてJsonの構造をクラスにしてみましょう。
そのうえで、Jsonをそのクラスのリストにして、foreachとkeyで取り出してやればうまくいきます。
参考URL:
http://sourcechord.hatenablog.com/entry/2015/06/08/173805
投稿2016/09/23 06:59
総合スコア2021
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
Q&A
解決済
ASP.NETのチェックボックスの実装方法
回答1
クリップ0
更新
2020/09/02
Q&A
解決済
スクロールできるテーブルの一番上の行を固定したい
回答2
クリップ0
更新
2023/05/10
Q&A
解決済
asp.netでdiv要素の値を保持したい
回答1
クリップ1
更新
2023/05/29
Q&A
解決済
①テーブルをスクロールさせたいです。②CSSの見えない重なりを解消したいです。
回答2
クリップ0
更新
2023/05/08
Q&A
解決済
spring bootで新規登録機能を作成したい。
回答1
クリップ0
更新
2023/06/02
Q&A
解決済
接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。
回答1
クリップ0
更新
2023/04/05
Q&A
受付中
お問合せフォームから送信したデータを正しくphpmyadminに登録したい
回答1
クリップ1
更新
2023/06/03
Q&A
解決済
Ajax成功時の部分ビューの更新 (ASP.NET Core MVC)
回答1
クリップ0
更新
2023/06/01
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。