使用子类反序列化JSON数据

4

我问过自己这个问题很多次,但一直没有想到解决方案。
假设有一种仓库管理软件,它将所有保存的产品输出为json文件。产品可以以一般形式或更具体的形式保存。
例如,有两种类型的产品:

General product: { "pid": 12345, "name": "SomeGeneralProduct" }
Special product: { "pid": 67890, "name": "SpecialProduct", "color": "green" }

可能会有更多变化,但所有变化都具有pidname的共同点。
现在我想解析和分析一堆以JSON文件形式获得的产品。
我可以创建一个包含产品可能拥有的所有成员的类Product,但我认为这是浪费时间/可维护性的做法,可以用更 OOP 的方式解决。唯一的问题是到目前为止我找不到任何关于这个主题的资料。

最终我真正想要的是类似于这样的东西:

class BaseClass
{
    public int Pid { get; set; }
    public string Name { get; set; }
}

class DerivedClass : BaseClass
{
    public string Color { get; set; }
}

string jsonProducts = "JSON-DATA-OF-PRODUCTS";
List<BaseClass> products = SomeDeserializer.Deserialize(jsonProducts);

(注:我知道我想要的例子太简单了,但我只是想明确表示如果可能的话,我不想在我的主代码中有大量的if / else或switch语句)
我想知道如何解决这个问题?是否有任何库可以处理这个问题,或者有什么好的方法来解决这个问题?

我已经在使用Json.NET,所以这不是问题 :) 谢谢你提供的参考,我会试一下。 - TorbenJ
2个回答

2

Json .Net 可以为您提供帮助。

如上所述,您可以使用方法 JsonConvert.DeserializeObject()

只需设置 var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; 这个选项

然后像这样反序列化:

List<Product> pList = JsonConvert.DeserializeObject<List<Product>>(jsonString, settings);

2
这种情况下这是行不通的,因为我不知道条目的类型,也无法影响产品的序列化,因为我不能修改提供JSON数据的软件。 - TorbenJ
抱歉,那么,你能用DBC的方法让它工作吗? - Boot750

0

我在寻找类似的东西,这是我想出来的解决方案

  1. 在基类中有一个静态字典 <subclass_identifier, Type>
  2. 在每个子类中,都有一个静态构造函数来插入子类型标识符和子类型

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接