【发布时间】:2012-07-30 01:50:36
【问题描述】:
我正在尝试移动一些代码以使用 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 类型的实例。类型是接口或抽象类,无法实例化。”
如果我派生一个 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 方法以使序列化再次工作。
有人可以帮忙吗?
这是解决问题的“正确”方法吗?
【问题讨论】:
-
除了下面的答案之外,您还可以覆盖
CanWrite并返回false。见How to use default serialization in a custom JsonConverter。 -
@AndyDBell - 您可能需要考虑在此线程中接受其中一个答案作为已接受的答案。已经有一些非常好的答案。您可以使用投票按钮下方的复选标记将最有帮助的答案标记为已接受的答案。
-
虽然cuongle 的answer 很棒,并且很好地利用了Json.NET 自己的
CustomCreationConverter<T>,但要将转换器应用于收集项使用[JsonProperty (ItemConverterType = typeof(SamplesJsonConverter))],如this answer 所示到Serialize a container of enums as strings using JSON.net。
标签: c# json serialization json.net deserialization