2014-02-08 117 views
5

我有这样的表:vb.net数据表中序列化到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

你再反序列化视为一个字典,或者它可以处理的数据表?真棒,但是。 – Feign