JSON.NET中基于属性的类型解析

是否可以使用JSON.NET基于JSON对象的属性覆盖类型解析? 基于现有的API,看起来我需要一种接受JsonPropertyCollection并返回要创建的Type的方法。

注意:我知道TypeNameHandling属性 ,但添加了$type属性。 我无法控制源JSON。

看起来这是通过创建自定义JsonConverter并在反序列JsonSerializerSettings.Converters之前将其添加到JsonSerializerSettings.ConvertersJsonSerializerSettings.Converters

nonplus在Codeplex的JSON.NET讨论板上留下了一个方便的样本。 我修改了示例以返回自定义Type并推迟到默认创建机制,而不是在现场创建对象实例。

 abstract class JsonCreationConverter : JsonConverter { ///  /// Create an instance of objectType, based properties in the JSON object ///  protected abstract Type GetType(Type objectType, JObject jObject); public override bool CanConvert(Type objectType) { return typeof(T).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jObject = JObject.Load(reader); Type targetType = GetType(objectType, jObject); // TODO: Change this to the Json.Net-built-in way of creating instances object target = Activator.CreateInstance(targetType); serializer.Populate(jObject.CreateReader(), target); return target; } } 

这是示例用法(也如上所述更新):

 class VehicleConverter : JsonCreationConverter { protected override Type GetType(Type objectType, JObject jObject) { var type = (string)jObject.Property("Type"); switch (type) { case "Car": return typeof(Car); case "Bike": return typeof(Bike); } throw new ApplicationException(String.Format( "The given vehicle type {0} is not supported!", type)); } }