2015-09-21 32 views
2

我有一些反序列化一些JSON字符串到c#对象的问题。JSON反序列化器继承了泛型类型

假设我有以下代码:

public class A 
{ 
    public string Name { get; set; } 
} 

public class B : A 
{ 
    public int Age { get; set; } 
} 

public class C 
{ 
    public ObservableCollection<A> As 
    { 
     get; 
     set; 
    } 
} 

而且我序列以下对象_c

C _c = new C(); 
_c.As.Add(new B() { Name = "Max", Age = 4 }); 

这工作得很好。

但我无法反序列化创建的JSON字符串并创建B的实例,因为ObservableCollection是以A作为泛型类型声明的。有没有办法告诉Newtonsoft.Json使用B而不是A

非常感谢。

+0

我本来以为Json的净使用的实例... –

回答

1

解决了问题,编写自定义JsonConverter:

public class BCJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return true; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var currentType = (existingValue as System.Collections.ObjectModel.ObservableCollection<A>); 

     currentType.Clear(); 

     var des = serializer.Deserialize<IList<B>>(reader); 

     foreach (var toAdd in des) 
     { 
      currentType.Add(toAdd); 
     } 

     return currentType; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     serializer.Serialize(writer, value); 
    } 
} 

而且

public class C 
{ 
    public virtual ObservableCollection<A> As 
    { 
     get; 
     set; 
    } 
} 

public class D : C 
{ 
    [Newtonsoft.Json.JsonConverter(typeof(BCJsonConverter))] 
    public override ObservableCollection<A> As 
    { 
     get; 
     set; 
    } 
} 
1

好像你解决它,但你可以改变你的类C约束达到同样的事情,而无需使用任何自定义JSON转换器。见下文:

public class C<T> where T : A 
{ 
    private ObservableCollection<T> _as = new ObservableCollection<T>(); 

    public ObservableCollection<T> As 
    { 
     get { return _as; } 
     set { _as = value; } 
    } 
} 

然后去/序列像

var _c = new C<B>(); 
_c.As.Add(new B() { Name = "Max", Age = 4 }); 

var serialized = JsonConvert.SerializeObject(_c); 
var deserialized = JsonConvert.DeserializeObject<C<B>>(serialized); // B 
+0

谢谢你,好像也不错。但是,这只有在我有权访问'C'并且它不在第三方库中时才有效。 – BendEg

+0

好的,你在你的问题中留下了这些细节:) –

+1

@BendEg *“但是,这只适用于我有权访问C并且不在第三方库中”* - 你如何建议添加'[Newtonsoft。 Json.JsonConverter(typeof(BCJsonConverter))]'从您的解决方案属性到第三方库? – qujck