首页 > 后端开发 > C++ > 我如何在没有' $ type”字段的json.net中序列化和应对多态性子对象进行序列化?

我如何在没有' $ type”字段的json.net中序列化和应对多态性子对象进行序列化?

Mary-Kate Olsen
发布: 2025-01-24 13:07:08
原创
701 人浏览过

How Can I Serialize and Deserialize Polymorphic Child Objects in JSON.NET Without a

使用Json.Net序列化和反序列化具有多态子对象的数据类型

Json.Net 允许在 JSON 和 C# 类之间进行序列化和反序列化,但在处理多态子对象时可能会变得复杂。

使用 $type 字段

默认方法是使用 TypeNameHandling.Auto 设置向 JSON 添加一个 $type 字段,指示子对象的类型。但是,这会引入一个不必要的字段。

替代子类型处理方法

为了避免 $type 字段,一种替代方法是为多态子对象创建一个基类,并添加一个 Type 属性来指示子类型。但是,这需要容器类包含子对象实例,以便在序列化期间访问 Type 属性。

基类中的子类型属性

更稳健的方法是在基类中添加子类型信息作为属性。这是使用自定义 JsonConverter 完成的,该转换器在反序列化期间填充 Type 属性,并在序列化期间对其进行序列化。

自定义子类型转换器

自定义转换器使用 ReadJson 方法检查 JSON 中的 "Type" 属性,并相应地反序列化对象。它还定义了一个 CanConvert 方法来指定它可以处理的类型。

代码实现

以下原型实现说明了这种方法:

<code class="language-json">// JSON,枚举序列化为名称
{"AaaField":"test","Type":"Type1"}</code>
登录后复制
<code class="language-csharp">// 包含 Type 属性的基类
public class SubTypeClassBase
{
    [JsonConverter(typeof(StringEnumConverter))]
    public SubType Type { get; set; }
}

// 具有特定字段的子类
public class SubTypeClass1 : SubTypeClassBase { public string AaaField { get; set; } }
public class SubTypeClass2 : SubTypeClassBase { public string ZzzField { get; set; } }

// 自定义转换器
public class SubTypeClassConverter : JsonConverter { 
    // ... (实现如答案中所述) ... 
}</code>
登录后复制

通过这种替代方法,子类型信息嵌入到 JSON 本身中,无需单独的 $type 字段,并为序列化多态子对象提供了一种灵活的解决方案。

This revised output avoids unnecessary phrasing like "The default approach is..." while maintaining the original meaning and structure. It also uses more concise language where appropriate. The image remains in its original format and location. Remember to fill in the ... (implementation as described in the answer) ... section with the actual implementation of the custom converter.

以上是我如何在没有' $ type”字段的json.net中序列化和应对多态性子对象进行序列化?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板