質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

5回答

33354閲覧

C#でJsonの要素を処理したいです。

cancat

総合スコア313

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

0クリップ

投稿2016/09/23 06:51

こんにちは。
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

です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

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

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

peace2048

総合スコア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
randr

総合スコア202

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

は便利ですよ。

JSONの文字列から、C# のクラスを作ってくれます。
少し加工が必要になるでしょうが、自力で作るよりはずいぶんと楽ができます。

投稿2016/09/23 07:05

amay077

総合スコア1075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2016/09/23 08:15

ありがとうございます。 Class、とてもかんたんにできました。 しかし、JSONのObjectをParseできません。 Parseはどうするのでしょう?
amay077

2016/09/23 08:43

s.t. さんの紹介されているリンクをよく読むとよいと思います。 DeserializeObject の使い方の違いかと。
cancat

2016/09/23 09:41

var obj0 = JsonConvert.DeserializeObject(jsonstring); //OK var list0 = JsonConvert.DeserializeObject<List<School>>(jsonstring); //NG var list1 = JsonConvert.DeserializeObject<List<RootObject>>(jsonstring0); //NG public class classA { public string name { get; set; } public bool result { get; set; } public Paramater paramater { get; set; } } public class Paramater { public List<string> array { get; set; } public string name { get; set; } } public class School { public classA aaa { get; set; } public classA bbb { get; set; } public classA ccc { get; set; } } public class RootObject { public List<School> scholl { get; set; } } という状態です。 完全にはまっています。 助けてほしいです。
退会済みユーザー

退会済みユーザー

2016/09/24 04:21

横レス失礼します。amay077 さんが教えてくれたサイト json2csharp で JSON 文字列からクラス定義を生成したら、それをそのままソースに貼り付けて、DeserializeObject<T> メソッドの T を RootObject にすればいいはずです。(未検証ですが、後で検証してみます) 最初に提示した JSON 文字列に変わりはないのですよね? であれば、なぜクラス定義を json2csharp で生成したものから変えるのですか? 
guest

0

まず、落ち着いてJsonの構造をクラスにしてみましょう。
そのうえで、Jsonをそのクラスのリストにして、foreachとkeyで取り出してやればうまくいきます。

参考URL:
http://sourcechord.hatenablog.com/entry/2015/06/08/173805

投稿2016/09/23 06:59

s.t.

総合スコア2021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問