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

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

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

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

JSON

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

1回答

4312閲覧

【C#】dynamic型jsonデータの最下層を検出。ループする方法

mukkun

総合スコア882

C#

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

JSON

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2016/11/28 08:29

現在C#でjsonファイルを元に、
DataGridViewにへッダを追加する処理を書いています。

DynamicJsonという3rdPartyのライブラリを使用して、
HTTP通信にてJSONファイルを取得し、dynamic型にパース後、
key階層でDataGridViewにヘッダーを追加したいと考えています。

JSONファイルは自作ですが、
下層(ネスト)が動的に変更される為、
foreachとifでゴリゴリ書くと冗長かつ汚くなってしまいます。

何か良い方法などありましたら
ご教授頂ければと思います。

実装予定のヘッダ

JSON

1{ 2"test": { 3 "A": "", 4 "1": { 5 "B": "", 6 "C": "" 7 }, 8 "D": "", 9 "2": { 10 "E": "", 11 "F": "", 12 "2-1": { 13 "G": "", 14 "H": "" 15 }, 16 "3": { 17 "I": "", 18 "J": "" 19 } 20 } 21 } 22}

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

json.netなら簡単なんですけどねぇ。特にこだわりがないならそちらへ移行することをオススメします。

json.netでDescendants関数を使えば一発
Look Up any node in Json.NET

投稿2016/11/28 08:47

編集2016/11/28 08:49
ishi9

総合スコア1294

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

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

mukkun

2016/11/28 11:01

ご回答ありがとうございます。 DynamicJsonより全然良さそうですね。こちらを使わせて頂きます。 確かに最下層のキー名がわかっていればLINQで取れるのですが、 次のオブジェクトが存在するまでループ みたいなことがしたいと考えております。 ご存知であればご教授頂ければと思います。 よろしくお願いします。
mukkun

2016/11/29 01:39

ご回答有り難うございます。 おそらく深さ優先になります。 DataGridViewへカラムの追加方法をあまり理解していませんが、 ヘッダの結合を行わないと行けないように思えます。 画像の「2」の場合、 2をどれだけ結合するかは「2」の中にある要素数を取得する必要があると思いました。
ishi9

2016/11/29 02:18

一応、シンプルな再帰ありの深さ優先アルゴリズムの例を書いておきます void Traverse(JToken token,ref Object result) { var children = token.Children(); if (children.Count() == 0) { // ここが末端 var parent = token.Parent; // 親が何だったのか確認してみたり } else { foreach (JToken child in children) { Traverse(child, ref result); } } } JToken root = JToken.Parse(jsonStr); Traverse(root, ref result); 「ref Object result」の部分は返り値のようなもので別に必要ありません。 もしも使う場合は自分が格納したい結果の型にしておいてください。 後は「この要素のTypeがJTokenType.Propertyなら弾く」とか用途に応じてカスタマイズしてください。
mukkun

2016/11/29 04:22

こういった方法があるのですね。 スッキリしたコードを書けそうです。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問