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

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

新規登録して質問してみよう
ただいま回答率
85.35%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

JSON

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

0回答

2261閲覧

VB.NETでJsonの値とキーを階層ごとに取得する方法(そのキーの階層を保存する方法)

anpan___

総合スコア28

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

JSON

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/05/24 09:29

編集2020/05/24 12:16

現在WwbAPIを用いて学習を行なっています。
ポストを送って返ってきたJsonの値を
フォームに配置したDataGridViewに下記のように表として表示をしたいと考えております。

Json

1 "A": { 2   "A-B": false, 3 "A-C": [100,0], 4 "A-D":[ 5 { 6 "D-1": "10", 7 "D-2": { 8 "D-2-1": "20", 9 "D-2-2": { 10 "D-2-2-1": "30" 11 } 12 } 13}

上記のJsonを下記のように、階層のキーを全て取得して表示したいと考えています。
実際にコーディングしたのですが、
2階層戻るときに表示がうまくできていない現状です。

DataGirdView

1キー      値 2A.A-B.A-C false 3A.A-C(1) 100 4 (2) 0 5A,A-D,D-1 10 6A,A-D,D-2,D-2-1 20 7A,A-D,D-2,D-2-2-1 30

現状のコードでおかしな点を教えて欲しいと思っております。
詳しい方どうぞよろしくお願いします。
実際のコードは下記の通りです。

VB.NET

1Dim KName As String = Nothing 2Dim Key As String = Nothing 3 4'ロードイベントにて 5'Jsonはデシリアライズしたものです。 6SetDGV(Json, Key) 7 8 Private Sub SetDGV(source As JToken, Key As String) 9 10 If (source.Type = JTokenType.Object) Then 11 12 'Keyに変更があったときKNameを更新する 13 If Not KName = Key Then 14 KName = KName + " . " + Key 15 End If 16 17 CheckObject(DirectCast(source, JObject), KName) 18 19 ElseIf (source.Type = JTokenType.Array) Then 20 CheckArray(DirectCast(source, JArray), Key) 21 22 Else 23 Key = KName + " . " + Key 24 AddListView(source, Key) 25 End If 26 27 End Sub 28 29 Private Sub CheckObject(source As JObject, Key As String) 30 31 For Each Properties In source.Properties 32 SetDGV(Properties.Value, Properties.Name) 33 Next 34 35 End Sub 36 37 '配列の名前とその配列内の要素をAddListに渡して再帰 38 Private Sub CheckArray(source As JArray, key As String) 39 40 Dim Counter As Integer = 0 41 42 For Each value In source 43 44 '配列名の末尾に配列番号を追加 45 Dim ArrayName As String = key & "[" & Counter & "]" 46 47 SetDGV(value, ArrayName) 48 49 Counter = Counter + 1 50 51 Next 52 End Sub 53 54 'DataGridViewにキーと値を表示する処理 55 Private Sub AddListView(value As String, Key As String) 56 57 'If value IsNot "" AndAlso value IsNot Nothing Then 58 dr = dt.NewRow() 59 dr(0) = Key 60 dr(1) = value 61 dt.Rows.Add(dr) 62 'End If 63 64 End Sub

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

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

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

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

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

KoichiSugiyama

2020/05/24 11:33

SetDGVにどんな引数を渡しているかわからないと、どういう動作が正しいのかもわからないと思います。 せめめてSetDGVの呼び出し部分のソースも開示してもらった方がアドバイスを得られやすいと思います。
anpan___

2020/05/24 12:08

ご指摘ありがとうございます。 すぐに追加させていただきます!
退会済みユーザー

退会済みユーザー

2020/05/24 23:40

2階層に戻るというのはどういうことですか? うまくいかないでは何を期待してどうなったのかが分かりません。 A.A-B.A-C が False は正しいのですか? そうだとするとどういう法則でそうなるのですか?
退会済みユーザー

退会済みユーザー

2020/05/25 01:39

もう一つ、そもそも、JSON として質問に書いてある文字列は JSON として正しくないようです。元が正しくないのでは議論にならないかと・・・
KoichiSugiyama

2020/05/25 05:35

机上デバッグしただけなので外しているかもしれませんが、再帰的な動きをするのに、KNameが関数外で宣言されているため、階層に応じた値にならない場合がある(一度連結してしまうと戻せない)、ということのようですね。いっそのこと、KeyもKNameもそれぞれの関数の引数にしてやれば良いのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問