【发布时间】:2022-01-30 05:46:13
【问题描述】:
我有以下代码
using System;
using System.Collections.Generic;
using System.Text.Json;
public class Program
{
public static void Main()
{
Console.WriteLine("Hello World");
var shapes = new List<Shape>();
shapes.Add(new Circle { Name = "Circle1", Diameter = 2.0});
shapes.Add(new Circle { Name = "Circle2", Diameter = 2.0});
shapes.Add(new Rectangle { Name = "Rect1", Length = 2.0});
shapes.Add(new Rectangle { Name = "Rect2", Length = 2.0});
var serialized = JsonSerializer.Serialize(shapes);
Console.WriteLine(serialized);
}
public abstract class Shape
{
public string Name { get;set;}
}
public class Circle:Shape
{
public double Diameter { get;set;}
}
public class Rectangle:Shape
{
public double Length {get;set;}
}
}
序列化时,我丢失了矩形和圆形的属性,只从 Shape 中获取。
这是输出
[{"Name":"Circle1"},{"Name":"Circle2"},{"Name":"Rect1"},{"Name":"Rect2"}]
这是意料之中的,鉴于序列化程序认为它们都是“形状”,我怎样才能使它足够聪明,可以序列化到适当的子类
【问题讨论】:
-
你打算只使用Text.Json还是打开Newtonsoft.Json?
-
如果可能的话,希望坚持使用 Text.Json,
-
如果您想坚持使用 Text.Json,请查看 stackoverflow.com/questions/58074304/… 。 Newtonsoft 让它变得更容易。
-
但主要问题是从json反序列化
-
System.Text.Json 只序列化 declared 类型的属性 - 这里是
Shape- 而不是实际的具体类型 - 这里是Circle和Rectangle.见Why does System.Text Json Serialiser not serialise this generic property but Json.NET does?。如果只需要序列化,则可以序列化List<object>而不是List<Shape>,实际的具体类型将被序列化。但如果需要反序列化,请参阅Is polymorphic deserialization possible in System.Text.Json?。
标签: c# json .net system.text.json