JSON反序列化会覆盖现有的数据表结构

时间:2017-08-01 18:27:57

标签: json vb.net datatables

我正在使用NewtonSoft.json进行简单的json Desearialization:

 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 个答案:

答案 0 :(得分:1)

您使用特定架构序列化了DataSet,在反序列化时,您将获得准确的架构。这就是序列化的工作原理。如果您要合并现有的DataSet,或者要在反序列化后添加额外的列,则必须以编程方式执行此操作。

在您的示例代码中,假设dataset是现有的DataSet,您可能希望反序列化为新的临时DataSet,然后逐步完成,根据需要修复架构,然后逐行将其合并到现有的DataSet

如果您的架构是动态的,则必须在列表中存储一些关于列的元数据。至少是列名称和类型。反序列化后,您可以遍历该列表中的DataSet中缺少的任何列,以编程方式创建具有正确类型的列,并将其添加到其中。

有一个DataSet.Merge方法可以帮助您,它有一些选项可以处理丢失的架构。

  

调用Merge方法时,两个DataSet的模式   比较对象,因为模式可能有   被改变了。例如,在企业对企业方案中,新的   列可能已由自动过程添加到XML架构中。   如果源DataSet包含架构元素(添加了DataColumn   目标中缺少的对象,架构元素可以是   通过将missingSchemaAction参数设置为添加到目标   MissingSchemaAction.Add。在这种情况下,合并的DataSet包含   添加了架构和数据。

可能就像用以下代码替换反序列化行一样简单:

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