Dalam program saya, ini pertama kalinya saya mencoba mengurai konten JSON.
Hasil yang saya coba dapatkan adalah DataTable dengan kolom seperti ini:

| Text of group | Text of Item | Command of Item |    

JSONnya adalah sebagai berikut:

{
      "Groups": [
        {
          "Items": [
            {
              "Command": "Framework.Windows.Components.ESScrollerForm, ESGrid|SHOW|Χρήστες|ESGOUser|ESGOUser_def|||65535",
              "Key": "834888dd-c4d5-449a-96b7-67db5c3d2692",
              "Text": "Users",
              "ImageIndex": -1
            },
            {
              "Command": "Framework.Windows.Components.ESScrollerForm, ESGrid|SHOW|QuestionaireSurveyorQuery|ESTMTask|QuestionaireSurveyorQuery|||0",
              "Key": "b71de66d-2baf-4452-ada7-8fc67044876b",
              "Text": "QuestionaireSurveyorQuery"
            }
          ],
          "Expanded": true,
          "Tag": "",
          "Key": "b741e67a-a3cd-4b97-91cf-ae9c9d9db7d7",
          "Text": "Settings",
          "ImageIndex": -1
        },
        {
          "Items": [
            {
              "64String": "Soap",
              "Command": "cInvoke|Booked Requests Agent Booking|SHOW|ESMIS|BookedReqAgentBook||False",
              "Key": "bfbc3d4a-ef8a-49a0-918a-331813ba90fb",
              "Text": "Requests Agent Booking",
              "ImageIndex": -1
            },
            {
              "64String": "Jrse",
              "Command": "cInvoke|HHG SF Profit \u0026 Loss|SHOW|ESMIS|HHGFileProfitability||False",
              "Key": "cf1cbffc-aba9-4e0f-8d6c-ba7219932fb6",
              "Text": "HHG SF Profit \u0026\u0026 Loss",
              "ImageIndex": -1
            }
          ],
          "Tag": "..CSShortcuts\\HHGReporting.ebl",
          "Key": "eff0d713-a70e-4582-a103-b8cc5cecdad6",
          "Text": "HHGReporting",
          "ImageIndex": -1
       }
    ]
 }

Di masa lalu, saya telah berhasil menguraikan XML kompleks menggunakan XPATH, tetapi sekarang saya telah banyak berjuang menggunakan Newtonsoft.Json tanpa hasil.

Yang saya coba, adalah membuat 3 class terlebih dahulu menggunakan generator online:

Public Class Rootobject
    Public Property Groups() As Group
End Class

Public Class Group
    Public Property Items() As Item
    Public Property Expanded As Boolean
    Public Property Tag As String
    Public Property Key As String
    Public Property Text As String
    Public Property ImageIndex As Integer
End Class

Public Class Item
    Public Property Command As String
    Public Property Key As String
    Public Property Text As String
    Public Property ImageIndex As Integer
    Public Property 64String As String
End Class

Adakah ide bagaimana perintah deserialized seharusnya, agar mendapatkan data sebagai DataTable dengan struktur yang dijelaskan?

1
Ted Kon 28 Mei 2021, 14:43

1 menjawab

Jawaban Terbaik

Anda memiliki model kelas pekerja, beberapa perubahan diperlukan untuk membuatnya berfungsi sebagaimana dimaksud.

Sintaks semacam ini menyesatkan:

Public Property Groups() As Group

Ini bukan kumpulan objek, ini hanya objek tunggal Tipe Group.
Ubah semua menjadi:

Public Property Groups As Group()
'or 
Public Property Groups As List(Of Group)

Untuk mengonversi ke DataTable dengan pilihan Kolom tertentu, Anda perlu mengulangi koleksi Grup dan, untuk setiap grup, mengulangi koleksi Item, untuk mengekstrak nilai yang Anda butuhkan.
Di sini, saya menggunakan kelas khusus, GroupsHandler, yang berisi Model kelas yang digunakan untuk deserialize JSON yang kompatibel dan untuk mengonversi ke konten parsial DataTable dari struktur data yang dihasilkan.

Kelas GroupsHandler memperlihatkan dua metode Publik:

  • Deserialize(), digunakan untuk mengonversi ke .Net kelas konten JSON
  • ToDataTable(), digunakan untuk membuat DataTable dari konten deserialized.

Anda dapat menginisialisasi handler dan memanggil metode ini sebagai:

Dim handler = New GroupsHandler(Json)
' Only deserialize  
Dim myGroups = handler.Deserialize()

' Deserialize and convert to DataTable
Dim dt = handler.ToDataTable()

Nama kelas Group diubah di ItemsGroup, karena Group adalah kata kunci bahasa.
Nama properti 64String diubah di String64, karena Anda tidak dapat memiliki Nama Properti yang dimulai dengan angka.


Imports Newtonsoft.Json

Public Class GroupsHandler
    Private root As GroupsRoot = Nothing
    Private m_json As String = String.Empty

    Public Sub New(json As String)
        m_json = json
    End Sub

    Public Function Deserialize() As List(Of ItemsGroup)
        root = JsonConvert.DeserializeObject(Of GroupsRoot)(m_json)
        Return root.Groups
    End Function

    Public Function ToDataTable() As DataTable
        If root Is Nothing Then
            If String.IsNullOrEmpty(m_json) Then Return Nothing
            Deserialize()
        End If

        Dim dt As New DataTable("Groups")
        dt.Columns.AddRange(New DataColumn() {
            New DataColumn("GroupText", GetType(String)),
            New DataColumn("ItemText", GetType(String)),
            New DataColumn("ItemCommand", GetType(String))
        })

        For Each grp In root.Groups
            For Each item In grp.Items
                dt.Rows.Add(New Object() {grp.Text, item.Text, item.Command})
            Next
        Next
        Return dt
    End Function

    Public Class GroupsRoot
        Public Property Groups As List(Of ItemsGroup)
    End Class

    Public Class ItemsGroup
        Public Property Items As List(Of Item)
        <JsonProperty("Expanded", NullValueHandling:=NullValueHandling.Ignore)>
        Public Property Expanded As Boolean?
        Public Property Tag As String
        Public Property Key As Guid
        Public Property Text As String
        Public Property ImageIndex As Long
    End Class

    Public Class Item
        Public Property Command As String
        Public Property Key As Guid
        Public Property Text As String
        <JsonProperty("ImageIndex", NullValueHandling:=NullValueHandling.Ignore)>
        Public Property ImageIndex As Long?
        <JsonProperty("64String", NullValueHandling:=NullValueHandling.Ignore)>
        Public Property String64 As String
    End Class
End Class
1
Jimi 28 Mei 2021, 20:22