我正在尝试移动一些代码来使用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方法进行编码以使序列化再次工作。
有人能帮上忙吗?
首先,这是解决问题的“正确”方法吗?
发布于 2012-08-01 22:31:40
你不需要使用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());文档:
发布于 2014-01-14 17:57:14
它非常简单,由json.net提供开箱即用的支持,您只需在序列化和反序列化时使用以下JsonSettings:
JsonConvert.SerializeObject(graph,Formatting.None, new JsonSerializerSettings()
{
    TypeNameHandling =TypeNameHandling.Objects,
    TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple
});对于反序列化,请使用以下代码:
JsonConvert.DeserializeObject(Encoding.UTF8.GetString(bData),type,
    new JsonSerializerSettings(){TypeNameHandling = TypeNameHandling.Objects}
);只需注意JsonSerializerSettings对象初始化器,这对您来说很重要。
发布于 2016-11-02 23:11:04
我通过使用一个名为TypeNameHandling.All的特殊JsonSerializerSettings设置解决了这个问题
TypeNameHandling设置包括序列化JSON时的类型信息和读取类型信息,以便在反序列化JSON时创建创建类型
Serialization:
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
var text = JsonConvert.SerializeObject(configuration, settings);Deserialization:
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
var configuration = JsonConvert.DeserializeObject<YourClass>(json, settings);类YourClass可能具有任何类型的基类型字段,并且它将被正确序列化。
https://stackoverflow.com/questions/11754633
复制相似问题