2017-08-01 102 views
2

我使用的NewtonSoft.json JSON的簡單Desearialization:JSON反序列化覆蓋現有數據表結構

Private Sub Deserialize() 
     Dim json As String = "" 
     Try 
      Using sr As StreamReader = New StreamReader("C:\Temp\file.json") 
       json = sr.ReadToEnd 
      End Using 
      dataset= JsonConvert.DeserializeObject(Of DataSet)(json) 
     Catch ex As Exception 
     End Try 
    End Sub 

的數據集在VB代碼預先定義。客戶現在想要爲數據集內的數據表添加5列。我定義了該表中的列,但是當發生反序列化時,數據表列會被覆蓋回原始狀態,即沒有新列。

數據表總是添加和刪除列。這是生意。有了成千上萬的原始json佈局的現有記錄,如何在不更改現有數據結構的情況下加載數據,並允許用戶將數據添加到新列?

我是json的新手,希望得到任何幫助。

回答

1

你用一個特定的模式序列化了一個DataSet,當你反序列化它時你會得到確切的模式。這就是序列化的工作原理。如果您想要合併現有的DataSet,或者需要在反序列化之後添加額外列,則必須以編程方式執行此操作。

在您的示例代碼,假設dataset是現有DataSet,你想反序列化到一個新的臨時DataSet,然後通過行走,修復了該模式可以根據需要,然後通過合併它到您現有DataSet行行。

如果您的模式是動態的,您將不得不在存儲列表中存儲一些關於列的元數據。至少是列名和類型。反序列化後,您可以在這個列表裏對於那些從DataSet遺漏任何列,具有正確的類型創建列編程,並添加它們。


有一個DataSet.Merge方法,可以幫助你,它有一些如何處理丟失模式的選項。

當合並方法被調用,這兩個數據集 對象進行比較,因爲它有可能的模式可以具有 被改變的模式。例如,在企業對企業場景中,新的 列可能已通過自動過程添加到XML模式。 如果源DataSet包含目標中缺少的模式元素(添加的DataColumn 對象),則可以通過將missingSchemaAction參數設置爲 MissingSchemaAction.Add將模式元素添加到目標中,以將其添加到目標 。在這種情況下,合併的DataSet包含 添加的模式和數據。

可能是與更換您的反序列化一行:

dataset.Merge(JsonConvert.DeserializeObject(Of DataSet)(json), true, MissingSchemaAction.AddWithKey) 
+0

謝謝你指出正確的方向我。 –

+0

如果此代碼解決了您的問題,則將其標記爲接受的答案。如果它只是幫助你找到答案,但你必須修改它才能使其起作用,你應該將解決方案作爲你自己的答案發布(你可以這麼做)。這將有助於任何有相同問題的人。 –

+0

我很抱歉,因爲這是我第一次使用StackOverflow。 –