vb.net datatable Serializzazione json

Ho questo tipo di tabella:

vb.net datatable Serializzazione json

Ho bisogno di questo JSON (naturalmente potrebbe essere una qualunque struttura/albero è più importante):

vb.net datatable Serializzazione json

Tabella di dati può cambiare, quindi la serializzazione, devono essere dinamici. Sto lavorando con vb.net e utilizzato questo codice:

 Public Function GetJson() As String
        Dim dt As New System.Data.DataTable
        dt = CreateDataTable() 'here I retrive data from oracle DB
        Dim serializer As New System.Web.Script.Serialization.JavaScriptSerializer()
        Dim packet As New List(Of Dictionary(Of String, Object))()
        Dim row As Dictionary(Of String, Object) = Nothing
        For Each dr As DataRow In dt.Rows
            row = New Dictionary(Of String, Object)()
            For Each dc As DataColumn In dt.Columns
                row.Add(dc.ColumnName.Trim(), dr(dc))
            Next
            packet.Add(row)
        Next
        Return serializer.Serialize(packet)
    End Function

Ma questo codice mi restituisce male json: [{"NAME":"city","PARENT":"address","VALUE":"has child"},{"NAME":"coordinates","PARENT":"address","VALUE":"has child"},{"NAME":"street","PARENT":"address","VALUE":"has child"}.......

Qualcuno può aiutarmi qui?

OriginaleL’autore innspiron | 2014-02-08

2 Replies
  1. 9

    ‘Oh-no, non c’era’ versione:

    Public Function GetJson(ByVal dt As DataTable) As String
        Return New JavaScriptSerializer().Serialize(From dr As DataRow In dt.Rows Select dt.Columns.Cast(Of DataColumn)().ToDictionary(Function(col) col.ColumnName, Function(col) dr(col)))
    End Function
    Si può quindi deserializzare come un dizionario, o può maneggiare datatable? Linea impressionante, però.

    OriginaleL’autore Matthew Hudson

  2. 1

    Ecco la mia soluzione:

    Public Function GetJson() As String
    
        Dim dt As New System.Data.DataTable
        dt = CreateDataTable() 'here I retrive data from oracle DB
        Dim serializer As New System.Web.Script.Serialization.JavaScriptSerializer()
        Dim packet As New List(Of Dictionary(Of String, Object))()
        Dim row As Dictionary(Of String, Object) = Nothing
    
        Try
            Dim result() As DataRow = dt.Select("Parent_ = 'main'")
            Dim i As Integer
            For i = 0 To result.GetUpperBound(0)
                row = New Dictionary(Of String, Object)()
                If UCase(result(i)(2)) <> "HAS CHILD" Then
                    row.Add(result(i)(0), result(i)(2))
                Else
                    row.Add(result(i)(0), add_(dt, result(i)(0)))
                End If
                packet.Add(row)
            Next i
    
            Return serializer.Serialize(packet)
        Catch ex As Exception
            MsgBox(ex.ToString)
            Me.Close()
        End Try
    
    End Function
    
    Public Function add_(ByVal dt As System.Data.DataTable, ByVal parent_ As String) As Dictionary(Of String, Object)
        Dim row As Dictionary(Of String, Object) = Nothing
        Try
            Dim result() As DataRow = dt.Select("Parent_ = '" & parent_ & "'")
            Dim i As Integer
            row = New Dictionary(Of String, Object)()
            For i = 0 To result.GetUpperBound(0)
    
                If UCase(result(i)(2)) <> "HAS CHILD" Then
                    row.Add(result(i)(0), result(i)(2))
                Else
                    row.Add(result(i)(0), add_(dt, result(i)(0)))
                End If
            Next i
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
        Return row
    End Function

    OriginaleL’autore innspiron

Lascia un commento