【问题标题】:JSON deserialization overwrites existing datatable structureJSON反序列化覆盖现有数据表结构
【发布时间】:2017-08-01 18:27:57
【问题描述】:

我正在使用 NewtonSoft.json 对 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 新手,如果能提供任何帮助,我将不胜感激。

【问题讨论】:

    标签: json vb.net datatables


    【解决方案1】:

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

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

    如果您的架构是动态的,您将不得不将一些关于列的元数据存储在某处的列表中。至少,列名称和类型。反序列化后,您可以遍历该列表以查找 DataSet 中缺少的任何列,以编程方式创建具有正确类型的列,然后将它们添加进去。


    有一个DataSet.Merge 方法可以帮助你,它有一些关于如何处理缺失模式的选项。

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

    可能就像将您的反序列化行替换为一样简单:

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

    【讨论】:

    • 如果此代码解决了您的问题,您将其标记为已接受的答案。如果它只是帮助您找到答案,但您必须对其进行修改才能使其正常工作,您应该将您的解决方案作为您自己的答案发布(您可以这样做)。这将帮助遇到同样问题的其他人。
    • 抱歉,这是我第一次使用 StackOverflow。
    • 没问题。关于 StackOverflow 要记住的重要一点是,其目的是建立一个解决方案数据库。这不仅仅是帮助一个人解决问题,而是帮助他们,以及任何有类似问题的人。这就是为什么拥有高质量、格式良好的问题(如您的问题)和答案很重要的原因。欢迎!
    猜你喜欢
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多