我正在使用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的新手,非常感谢任何可用的帮助。
答案 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)