使用JsonConvert.DeserializeObject反序列化派生对象列表

我有这个对象

public class ConversationAPI { [JsonProperty(PropertyName = "lU")] public DateTime LastUpdated { get; set; } [JsonProperty(PropertyName = "m", TypeNameHandling = TypeNameHandling.All)] public List Messages { get; set; } } 

我作为json从API发送,并在我的客户端应用程序中反序列化。

 The List Messages property contains either [Serializable] public class Message { [JsonProperty(PropertyName = "t")] public string Text { get; set; } [JsonProperty(PropertyName = "ty")] public MessageType Type { get; set; } } 

要么

 [Serializable] public class DerivedMessage : Message { [JsonProperty(PropertyName = "sos")] public string SomeOtherStuff{ get; set; } } 

我似乎无法反序列化派生类型的数组。 我试过这个

 var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All, TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full }; var conversation = JsonConvert.DeserializeObject(response.Content, settings); 

我希望列表消息同时具有MessageDerivedMessage对象。

有任何想法吗? 谢谢

找到了解决方案。 我使用了自定义转换器

 public class MessageConverter : JsonCreationConverter { private const string SomeOtherStuffField = "sos"; protected override ConversationAPI.Message Create(Type objectType, JObject jObject) { if (FieldExists(SomeOtherStuffField , jObject)) { return new ConversationAPI.DerivedMessage (); } return new ConversationAPI.Message(); } private bool FieldExists(string fieldName, JObject jObject) { return jObject[fieldName] != null; } } public abstract class JsonCreationConverter : JsonConverter { ///  /// Create an instance of objectType, based properties in the JSON object ///  /// type of object expected /// contents of JSON object that will be deserialized ///  protected abstract T Create(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) { // Load JObject from stream JObject jObject = JObject.Load(reader); // Create target object based on JObject T target = Create(objectType, jObject); // Populate the object properties serializer.Populate(jObject.CreateReader(), target); return target; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } } 

你会像这样使用它:

 var jsonText = "{a string of json to convert}" JsonConverter[] conv = new JsonConverter[] { new MessageConverter() }; var jsonResponse = JsonConvert.DeserializeObject(jsonText, conv);