问题描述
如何用Newtonsoft.Json正确解析属性为“接口集合<接口>”的字符串我想要能够正确解析CC类,也就是其属性是IList<I>,都是接口类型的。请注意,DD类中可能还继续包含更深层次的集合接口。比如DD还包含D3是IList<IDD4>.//CCocc=JsonConvert.DeserializeObject<CC>(s);//提示错误:Errorsettingvalueto'C3'on'ConsoleApplication1.CC'.usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingNewtonsoft.Json;usingNewtonsoft.Json.Serialization;usingNewtonsoft.Json.Converters;usingSystem.Diagnostics;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){strings="{"B":"sdfasdf","C3":[{"a":"sdfasdf"},{"a":"adsfasdf33333333"}]}";//提问,如何用Newtonsoft.Json正确解析属性为“接口集合<接口>”的字符串//我想要能够正确解析CC类,也就是其属性是IList<I>,都是接口类型的。//请注意,DD类中可能还继续包含更深层次的集合接口。比如DD还包含D3是IList<IDD4>.//CCocc=JsonConvert.DeserializeObject<CC>(s);//提示错误:Errorsettingvalueto'C3'on'ConsoleApplication1.CC'.CC2occ2=JsonConvert.DeserializeObject<CC2>(s);//能够正确解析Debug.Print(((DD)occ2.C3[0]).a);//CC3occ3=JsonConvert.DeserializeObject<CC3>(s);//提示错误:Errorsettingvalueto'C3'on'ConsoleApplication1.CC'.//Debug.Print(((DD)occ3.C3[0]).a);}}///<summary>///请注意CCCC2CC3只是在C3的定义上有区别。CC是我要最终实现的类。///</summary>publicclassCC2{publicstringB;[JsonConverter(typeof(ConcreteTypeConverter<List<DD>>))]publicIList<DD>C3;}publicclassCC3{publicstringB;[JsonConverter(typeof(ConcreteTypeConverter<List<DD>>))]publicList<IDD>C3;}publicclassCC{publicstringB;[JsonConverter(typeof(ConcreteTypeConverter<List<DD>>))]publicIList<IDD>C3;}publicinterfaceIDD{stringa{get;set;}}publicclassDD:IDD{publicstringa{get;set;}}publicclassConcreteTypeConverter<T>:JsonConverter{publicoverrideboolCanConvert(TypeobjectType){//assumewecanconverttoanythingfornowreturntrue;}publicoverrideobjectReadJson(JsonReaderreader,TypeobjectType,objectexistingValue,JsonSerializerserializer){//explicitlyspecifytheconcretetypewewanttocreatereturnserializer.Deserialize<T>(reader);//实现不了}publicoverridevoidWriteJson(JsonWriterwriter,objectvalue,JsonSerializerserializer){//usethedefaultserialization-itworksfineserializer.Serialize(writer,value);}}}
解决方案
解决方案二:
高端大气上档次,低调奢华有内涵
解决方案三:
解决方案四:
已知:interfaceIPet{stringname;}classCat:IPet{publicstringname{get;set;}}classDog:IPet{publicstringname{get;set;}}
现有Json:{name:"Kitty"}被IPet来反序列化,你能确定它是Cat还是Dog吗?
解决方案五:
不要用问题来回答问题。只要属性符合,完全没问题,而且我也手动给出了反序列化的类型。两个类,属性一样,方法一样,所有对外公开的接口都一样,就封装性来说他就是同一个类,至少是可以随意替换的一类。所以我只要完成这个就可以了。
解决方案六:
List<DD>跟List<IDD>毫无关系,没有继承关系。你应该先学号泛型,再重新设计你的程序意图。
解决方案七:
你应该先看设计意图,设计的目的就是可以随意替换c3,当然不能有继承关系
解决方案八:
不要扯其他的了,还是专注于问题吧
解决方案九:
解决方案十:
版主,这个问题你还解决了?