我如何正确连接到 Json.NET 的 JObject.ToObject<T>()?

How do I properly hook into Json.NET's JObject.ToObject<T>()?

我有一个包含多个嵌套类型的数据结构。

public class MyDataType {
    public int InferrableInt { get; set; }
    public float InferrableFloat { get; set; }
    public InferrableNestedDataType MyINDT { get; set; }
    public CustomNestedDataType MyCNDT { get; set; }

    public class InferrableNestedDataType {
        public int X { get; set; }
        public int Y { get; set; }
    }
    public class CustomNestedDataType {
        // Data processed in a way that can't be expressed through JSON
        public string CustomData { get; set; }

        public int NestedInferrableInt { get; set; }
    }
}

大多数这些嵌套类型都可以通过默认行为推断出来。

我也有一个JObject从代码的另一部分收到。我希望能够:

var mydt = jobjectInstance.ToObject<MyDataType>()

...反序列化 MyDataType.CustomNestedDataType 时仅 运行 自定义代码。我发现的每个解决方案都已扩展 JsonConverter,但据我所知,这仅在从原始 JSON 解析时有效,而不是预解析的 JObject。在不为可推断数据类型编写自定义代码的情况下,执行此操作的正确方法是什么?

Every solution I've found has extended JsonConverter, but as far as I can tell this only works when parsing from raw JSON

它应该也适用于 JObject.ToObject。您至少有两个选择:

  • JsonAttributeConverter 属性应用于您的 class 以指定要使用的转换器:

    [JsonConverter(CustomNestedDataTypeConverter)]
    public class CustomNestedDataType
    

    (如果只是 CustomNestedDataType.CustomData 需要自定义序列化,请为此编写转换器并将属性应用于 属性)

  • 使用您的转换器创建一个 JsonSerializer,并将其传递给 JObject.ToObject:

    var serializer = new JsonSerializer();
    serializer.Converters.Add(new CustomNestedDataTypeConverter());
    
    var result = jObject.ToObject<MyDataType>(serializer);