使用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);
我希望列表消息同时具有Message和DerivedMessage对象。
有任何想法吗? 谢谢
找到了解决方案。 我使用了自定义转换器
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);