gpt4 book ai didi

c# - 具有 IEnumerable 类型属性的 NewtonSoft.Json 序列化和反序列化类

转载 作者:IT老高 更新时间:2023-10-28 12:44:10 24 4
gpt4 key购买 nike

我正在尝试移动一些代码以使用 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());

文档:Deserialize with CustomCreationConverter

关于c# - 具有 IEnumerable<ISomeInterface> 类型属性的 NewtonSoft.Json 序列化和反序列化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11754633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com