- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试移动一些代码以使用 ASP.NET MVC Web API 生成的 Json 数据而不是 SOAP Xml。
我在序列化和反序列化以下类型的属性时遇到了问题:
IEnumerable<ISomeInterface>.
这是一个简单的例子:
public interface ISample{
int SampleId { get; set; }
}
public class Sample : ISample{
public int SampleId { get; set; }
}
public class SampleGroup{
public int GroupId { get; set; }
public IEnumerable<ISample> Samples { get; set; }
}
}
我可以通过以下方式轻松序列化 SampleGroup 的实例:
var sz = JsonConvert.SerializeObject( sampleGroupInstance );
但是对应的反序列化失败了:
JsonConvert.DeserializeObject<SampleGroup>( sz );
带有此异常消息:
“无法创建 JsonSerializationExample.ISample 类型的实例。类型是接口(interface)或抽象类,无法实例化。”
如果我派生一个 JsonConverter,我可以如下装饰我的属性:
[JsonConverter( typeof (SamplesJsonConverter) )]
public IEnumerable<ISample> Samples { get; set; }
这是 JsonConverter:
public class SamplesJsonConverter : JsonConverter{
public override bool CanConvert( Type objectType ){
return ( objectType == typeof (IEnumerable<ISample>) );
}
public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer ){
var jA = JArray.Load( reader );
return jA.Select( jl => serializer.Deserialize<Sample>( new JTokenReader( jl ) ) ).Cast<ISample>( ).ToList( );
}
public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer ){
... What works here?
}
}
这个转换器解决了反序列化问题,但我不知道如何编写 WriteJson 方法以使序列化再次工作。
有人可以帮忙吗?
这是解决问题的“正确”方法吗?
最佳答案
您不需要使用 JsonConverterAttribute
,只需保持模型干净并使用 CustomCreationConverter
代替,代码更简单:
public class SampleConverter : CustomCreationConverter<ISample>
{
public override ISample Create(Type objectType)
{
return new Sample();
}
}
然后:
var sz = JsonConvert.SerializeObject( sampleGroupInstance );
JsonConvert.DeserializeObject<SampleGroup>( sz, new SampleConverter());
关于c# - 具有 IEnumerable<ISomeInterface> 类型属性的 NewtonSoft.Json 序列化和反序列化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11754633/
如何在 C# 4.0 中使用协方差将 IList 转换为 IList,其中 SomeObject 实现 ISomeInterface 我有类似以下内容 IList GetItems; IList it
目前,我正在学习 ASP.NET MVC 5。我被书上的依赖注入(inject)卡住了。我会尽力学习如何使用它,但在此之前,我希望您能帮助我。我几周前开始学习 C#,但我还没有弄清楚的一件事是界面。我
我遇到了通过接口(interface)获取正确的对象计数的问题: var count = session.Query().Count(); 有 2 个实现接口(interface) IDirty 的类
我在下面的代码中遇到了一些问题。 public ArrayList getEventsByDateRange(DateTime minStartTime, DateTime minEndTime)
我正在尝试移动一些代码以使用 ASP.NET MVC Web API 生成的 Json 数据而不是 SOAP Xml。 我在序列化和反序列化以下类型的属性时遇到了问题: IEnumerable. 这是
我正在尝试使用 JAXB 2.2.4 将接口(interface)序列化为 XML,但是当我在 Map<> 对象中有一个接口(interface)时,它会爆炸并给我错误: com.sun.xml.bi
我是一名优秀的程序员,十分优秀!