使用System.Text.Json序列化和反序列化派生类



我试图用类中的System.Text.Json来创建JSON对象。我有一个名为Element的基类,其定义如下

public interface IElement
{
public string? Type { get; set; }
public string? Name { get; set; }
}

然后,我有几个从中继承的类,例如

public class Textbox : IElement
{
[JsonPropertyName("type")]
public virtual string? Type { get; set; }
[JsonPropertyName("name")]
public string? Name { get; set; }
[JsonPropertyName("text")]
public string? Text { get; set; }
}
public class Radiobutton : IElement
{
[JsonPropertyName("type")]
public virtual string? Type { get; set; }
[JsonPropertyName("name")]
public string? Name { get; set; }
[JsonPropertyName("choises")]
public List<string> Choises = new List<string>();
}

现在,我想要一个类来定义具有所有元素的表单

public class Form
{
[JsonPropertyName("elements")]
public List<IElement> Elements { get; set; } = new List<IElement>();
}

之后,我定义了表单

Form form = new Form()
{
Elements = new List<IElement>()
{
new Textbox() { Name = "txt1", Type = "Textbox", Text = "One" },
new Radiobutton() { 
Name = "radio1", Type = "Radiobutton",
Choices = new List<string>() { "One", "Two", "Three" }}
}
};

如果我从这个对象创建JSON,它只有公共字段

{
"elements": [
{
"type": "Textbox",
"name": "txt1",
},
{
"type": "Radiobutton",
"name": "radio1",
}
]
}

文本框的字段Text或单选按钮的字段Choices将被忽略。我阅读了微软的文档:我尝试了代码

jsonString = JsonSerializer.Serialize<object>(weatherForecast, options);

但我得到了同样的结果。

如何使用Form对象的所有详细信息创建JSON,而不管Element的类型如何?Viceversa,当我有JSON时,我如何在Form类中反序列化它?

试试这个:

options = new JsonSerializerOptions
{
WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, weatherForecast.GetType(), options);