2014-02-08 2 views
5

У меня есть этот вид таблицы:vb.net DataTable Serialize к JSon

Мне нужно, чтобы получить этот JSON (конечно порядок может быть любой, структура/дерево является наиболее важным):

Таблица данных может меняться, поэтому сериализация должна быть динамической. Я работаю с vb.net и использовать этот код:

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 

Но этот код возвращает мне плохо: JSON [{"NAME":"city","PARENT":"address","VALUE":"has child"},{"NAME":"coordinates","PARENT":"address","VALUE":"has child"},{"NAME":"street","PARENT":"address","VALUE":"has child"}.......

Может кто-то помочь мне здесь?

ответ

1

Здесь не мое решение:

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 
5

'О-нет, вы не сделали' версия:

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 
+0

ли вы тогда десериализации в качестве словаря, или она может обрабатывать DataTable? Удивительная линия. – Feign