【发布时间】:2021-01-20 14:36:36
【问题描述】:
我有一个简单的用例,我想反序列化一个 JSON,它基本上是一个项目数组,项目并不相同,但它们都共享一个基类。
更新: 我的技术限制:
- 我从 webhook 接收 JSON,但无法更改序列化代码或注入 源 JSON 中的任何标记
-
Type属性是唯一用于在我想要反序列化到的派生类之间进行对应的信息 - 需要强类型实例而不是
dynamic实例 - 这些类在一个程序集中,我无法添加任何 Json 注释
代码如下:
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
public class Program
{
public static void Main()
{
var json = @" [{""Type"":0},{""Name"":""Derived"",""Type"":1}]";
var deserializedInstances = JsonConvert.DeserializeObject<List<BaseClass>>(json);
foreach(var e in deserializedInstances) {
if(e is BaseClass baseClass)
{
Console.WriteLine("Base Class , Type = {0}", baseClass.Type);
}else if(e is DerviedClass derivedClass)
{
Console.WriteLine("Derived Class , Type = {0}, Name = {1}", derivedClass.Type, derivedClass.Name);
}
}
// Output
// Base Class , Type = 0
// Base Class , Type = 0
}
public class BaseClass
{
public virtual int Type =>0;
}
public class DerviedClass: BaseClass
{
public string Name {get; set;}
public override int Type =>1;
}
}
所以这段代码会产生这样的输出:
// Base Class , Type = 0
// Base Class , Type = 0
但就我而言,我想要派生类的实例。
// Base Class , Type = 0
// Base Class , Type = 1, Name = "Derived"
就性能而言,实现这一目标的最佳方法是什么?
【问题讨论】:
-
您正在反序列化到 BaseClass... newtonsoft 应该如何知道数据是用于派生类的?您可能可以反序列化为派生类,如果名称为空,则其 BaseClass
-
你可以反序列化到
dynamic...然后从那里继续。 -
这只是一个 PoC。显示的代码远非“生产级”。我很少,几乎从不必须使用动态,所以肯定有优化算法来获得你想要的强类型,我不知道。
标签: c# json.net deserialization