Json.Net 允许在 JSON 和 C# 类之间进行序列化和反序列化,但在处理多态子对象时可能会变得复杂。
默认方法是使用 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中文网其他相关文章!