反序列化 appsettings.json 时多态反序列化不起作用

Polymorphic deserialization not working when deserializing appsettings.json

提问人:Nin 提问时间:8/9/2023 更新时间:8/9/2023 访问量:58

问:

我有一个基类 Target 和两个派生类 TargetA 和 TargetB。从 appsettings.json 开始,我想反序列化为派生对象的类型(在运行时可以是 TargetA 或 TargetB)。我正在使用 Dot Net Core 7.0 中提供的多态反序列化,并尝试从 Web API 项目反序列化。

'''

using System.Text.Json.Serialization;

[JsonDerivedType(derivedType:typeof(TargetA), typeDiscriminator: "A")]
[JsonDerivedType(derivedType: typeof(TargetB), typeDiscriminator: "B")]
public class Target
{
  public string Prop1{get;set;}
}

public class TargetA:Target
{
  public string PropA{get;set;}
}

public class TargetB:Target
{
  public string PropB{get;set;}
}

appsettings.json
{
 "TestTarget":{
  "$type":"A",
  "PropA":"valueA",
  "Prop1":"value1"
  }

public class Program.cs
{
  ....
  var configuration = new ConfigurationBuilder()
                            .AddJsonFile("appsettings.json")
                            .Build();
  var targetObj = configuration
                      .GetSection("TestTarget")
                      .Get<Target>();
}

'''

运行时,targetObj 仅具有基类“Target”的属性,而没有派生类“TargetA”的属性。

为了验证我是否正确实现了 JsonDerivedAttribute,我使用了以下代码来选择正确的“targetA”类型。

'''

var targetObj2 = new TargetA()
{
 PropA = "valueA",
 Prop1 = "value1"
}
var ser = JsonSerializer.Serialize<Target>(src);
var deser = JsonSerializer.Deserialize<Target>(ser);

'''

我不明白使用反序列化时缺少什么 我必须在其他地方明确提及吗?"configuration.GetSection("TestTarget").Get<Target>()".

C# AppSettings ASP.Net-Core-7.0 多态反序列化

评论

0赞 Guru Stron 8/9/2023
配置有自己的活页夹。此外,配置不是 JSON,配置是键值对的集合,可以表示为 JSON。
2赞 Nin 8/9/2023
@GuruStron 在这种情况下,我应该做哪些修改来获取派生对象?
1赞 Frank 11/15/2023
我自己在这个问题上花了太久。.NET Core 很好地、真正地提升了配置/设置的东西。为什么在众神的绿色地球上,appsettings 不使用标准的 json 反序列化

答: 暂无答案