在 System.Text.Json 序列化一个对象时,发现其中声明为接口的属性只序列化了接口中定义的属性,没有序列化接口实现中的属性,请问如何解决这个问题?
接口定义
public interface IHierarchicalCategory
{
public int? ParentId { get; set; }
IHierarchicalCategory? Parent { get; set; }
}
接口的实现定
public class BlogCategoryDto : IHierarchicalCategory
{
public int CategoryId { get; set; }
public int? ParentId { get; set; }
public string Title { get; set; }
public int ChildCount { get; set; }
public int? Order { get; set; }
public IHierarchicalCategory? Parent { get; set; }
}
序列化的结果
{
"parent": {
"parentId": 2264940,
"parent": {
"parentId": 2264939,
"parent": {
"parentId": null,
"parent": null
}
}
},
"categoryId": 2459008,
"title": "test4-1",
"childCount": 0,
"parentId": 2264944,
"order": null
}
通过 JsonDerivedType
attribute 解决了
[JsonDerivedType(typeof(BlogCategoryDto), nameof(BlogCategoryDto))]
[JsonDerivedType(typeof(TreeCategoryDto), nameof(TreeCategoryDto))]
public interface IHierarchicalCategory
{
public int? ParentId { get; set; }
IHierarchicalCategory? Parent { get; set; }
}
参考:
try try JsonTypeInfoResolver?
目前只是很少地方涉及到,如果用的多,或者接口与实现不在同一个 csproject,就要动用 JsonTypeInfoResolver
了