gpt4 book ai didi

c# - 依赖于版本的 Json 反序列化

转载 作者:太空狗 更新时间:2023-10-30 01:16:10 24 4
gpt4 key购买 nike

我正在寻找一种方法来使用 Json 本身中的数据从 Json 进行反序列化以依赖于版本。我的目标是使用 ServiceStack.Text.JsonDeserializer,但可以切换到另一个库。

例如,我想在 JSON 中为 v1.0 定义一个数据:

{
version: "1.0"
condition: "A < B"
}

然后,数据的下一个版本(比如 2.0)是:

{
version: "2.0"
condition: ["A < B", "B = C", "B < 1"]
}

最后,我希望能够验证数据的版本以了解如何正确反序列化 JSON。

更新:

在已知产品中似乎没有对依赖于版本的 JSON(反)序列化的任何类型的隐式支持。

正确的解决方案似乎是通过仅(反)序列化版本部分来拆分任务,然后对正确的类型使用隐式(反)序列化。

感谢所有就此问题分享知识和想法的人。

最佳答案

您可以执行以下操作之一:

  • 为要反序列化的数据对象创建一个基类,其中只包含一个 version 字段。
  • 使您的不同版本的数据类成为该基类的派生类。
  • 当你反序列化你的数据对象时,首先,将它反序列化为你的基类的一个实例 - 所以现在你有一个包含版本号的 POCO 对象。您可以使用它来决定应该使用哪个派生数据类来反序列化数据(在最简单的情况下,您可以执行 switch/case 并单独处理每个版本)

一个例子(使用System.Web.Script.Serialization.JavaScriptSerializer):

class BaseClass 
{
public int version { get; set; }
}

class FirstVersion: BaseClass
{
public string condition { get; set; }
}

class SecondVersion: BaseClass
{
public IEnumerable<string> condition { get; set; }
}

public void Deserialize (string jsonString)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
BaseClass myData = serializer.Deserialize<BaseClass>(jsonString);

switch (myData.version)
{
case 1:
FirstVersion firstVersion = serializer.Deserialize<FirstVersion>(jsonString);
// ...
break;
case 2:
SecondVersion secondVersion = serializer.Deserialize<SecondVersion>(jsonString);
// ...
break;
}
}

如您所见,此代码将数据反序列化两次 - 如果您正在处理大型数据结构,这对您来说可能是个问题。如果您想不惜一切代价避免这种情况,您要么必须放弃静态类型,要么修改应用程序的数据模型。

下面是 dynamic 的样子:

public void Deserialize (string jsonString)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
dynamic myData = serializer.Deserialize<object>(jsonString);

if (myData ["version"] == 1) {
...
}
}

还可以选择编写您自己的自定义 JavaScriptConverter .这需要做更多的工作,但我很确定你可以实现你想要的,而且看起来会更好。

另一个要考虑的建议是永远不要从 JSON 结构中删除属性。如果你需要修改一个属性,保留旧的并添加一个新的 - 这样,旧代码总是可以从新代码读取数据。当然,如果您大量修改数据结构,这可能很快就会失控...

在 Java 中,您可以使用 Google 的 GSON 库,因为它有一个 built-in support for versioning .我没有调查过,但它是open source如果它对您真的很重要,我想您可以将实现移植到其他语言。

关于c# - 依赖于版本的 Json 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36218196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com