投稿者 まほ  (学生) 投稿日時 2021/4/15 19:57:01
VB初心者です。
ファイル化されたJSONデータを読込みDataTableに格納しようとしているのですが思ったように格納できません。

読み込むJSONは以下の形式です。
「list」と「grouplist」のキー名は決まっています。
ただしgrouplistの要素数とそれに対応するグループのキー及び要素数は読込むJSONごとに異なります。

-------------------------------------------------------------------------
例:Json1
{
"list": {
"grouplist": ["fruit", "animal", "flower"],
"fruit": ["リンゴ","バナナ","イチゴ"],
"animal": ["イヌ","ネコ","ウサギ"],
"flower": ["バラ","ユリ","キク"]
}
}
-------------------------------------------------------------------------
例:Json2
{
"list": {
"grouplist": ["fruit","animal","flower","human"],
"fruit": ["リンゴ","バナナ","イチゴ","モモ","ブドウ"],
"animal": ["イヌ","ネコ","ウサギ","リス","ウシ"],
"flower": ["バラ","ユリ","キク","チューリップ","ヒマワリ"]
"human": ["タナカ","サトウ","ヤマダ","カトウ"],
}
}
-------------------------------------------------------------------------
   Imports System.IO
   Imports System.Text
   Imports Newtonsoft.Json
   Imports Newtonsoft.Json.Linq

   Public JsonDataTable As New DataTable


   Private Sub AppLoad(sender As Object, e As EventArgs) Handles Me.Load
        Call LoadJson(Application.StartupPath & "\test.json")
   End Sub

   Private Sub LoadJson(ByVal FilePath As String)

        Dim enc As Encoding = Encoding.UTF8
        Dim jsonStr As String

        'ファイルからJson文字列を読み込む 
        Using sr As New StreamReader(FilePath, enc)
            jsonStr = sr.ReadToEnd()
        End Using

        'Json文字列をJson形式データに復元する 
        Dim jsonObj As Object = JsonConvert.DeserializeObject(jsonStr)

        'listからgrouplist内の要素を取得 
        Dim GrouplistArray As JArray = CType(jsonObj("list")("grouplist"), JArray)

        'listのgrouplist内の要素を全て取得 
        For i As Integer = 0 To GrouplistArray.Count - 1

            'グループの列を作成 
            Dim CurrentGroupName As String = GrouplistArray(i).ToString
            JsonDataTable.Columns.Add(CurrentGroupName)

            'グループの要素を配列に格納 
            Dim GroupItemArray As JArray = CType(jsonObj("list")(CurrentGroupName), JArray)

            'グループの配列要素をDataTableに格納 
            For Each Item As String In GroupItemArray
                Dim row As DataRow = JsonDataTable.NewRow
                row(CurrentGroupName) = Item
                JsonDataTable.Rows.Add(row)
            Next

        Next

        'DataTableの内容をDataGridViewに表示 
        DataGridView1.DataSource = JsonDataTable

    End Sub

このように記述すると二つ目以降のグループ要素が一つ前のグループ要素の次の行から格納されてずれてしまいます。

| fruit  | animal  | flower |
|リンゴ |           |          |
|バナナ|           |          |
|イチゴ |           |          |
|         |イヌ      |          |
|         |ネコ      |          |
|         |ウサギ  |          |
|        |          |バラ    |
|        |          |ユリ    |
|        |          |キク    |


読み込むJSONによってグループ数が不確定なので、列ごとにループで要素を格納するしか思いつかずこのような形になってしまいます。
全てのグループの要素を一行目からセットするにはどのように記述すればよいでしょうか?
ご教授をお願いします。