2016-12-05 81 views
2

我有一个数据结构与几个嵌套类型。如何正确挂钩到Json.NET的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。没有为可推断的数据类型编写自定义代码,这样做的正确方法是什么?

回答

1

每个解决方案,我发现已经扩展JsonConverter,但就从原始JSON解析的时候,我可以告诉这只能

它应与JObject.ToObject正常工作。您至少有两种选择:

  • 应用JsonAttributeConverter属性类,指定该转换器的使用方法:

    [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); 
    
+0

啊哈,有道理。谢谢! –