C# 自定义JSON反序列化器ServiceStack
我试图反序列化JSON格式的对象集合,它们有一个公共父类,但是当ServiceStack反序列化我的请求时,我得到父类类型集合中的所有元素,而不是每个单独的子类。是否可以创建自定义反序列化程序并避免ServiceStack自动反序列化 例如:C# 自定义JSON反序列化器ServiceStack,c#,json,polymorphism,servicestack,deserialization,C#,Json,Polymorphism,servicestack,Deserialization,我试图反序列化JSON格式的对象集合,它们有一个公共父类,但是当ServiceStack反序列化我的请求时,我得到父类类型集合中的所有元素,而不是每个单独的子类。是否可以创建自定义反序列化程序并避免ServiceStack自动反序列化 例如: class Canine { public Types Type { get; set; } } class Dog : Canine { public Dog() { Type = Types.Dog; } }
class Canine {
public Types Type { get; set; }
}
class Dog : Canine {
public Dog() {
Type = Types.Dog;
}
}
class Wolf : Canine {
public Wolf() {
Type = Types.Wolf;
}
}
public enum Types {
Canino = 1,
Perro = 2,
Lobo = 3
}
public class CanineService : Service {
public CanineResponse Post(Canine request) {
return new Canine().GetResponse(request);
}
}
我正在用JSON.NET反序列化这个JSON
public class CanineConverter : JsonConverter {
public override bool CanConvert(Type objectType) {
return typeof(Canine).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
var item = JObject.Load(reader);
switch (item["Type"].Value<int>()) {
case 2: return item.ToObject<Dog>();
case 3: return item.ToObject<Wolf>();
}
return item["Type"].Value<Types>();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
throw new NotImplementedException();
}
}
公共类CanineConverter:JsonConverter{
公共覆盖布尔CanConvert(类型objectType){
返回类型(犬科)。IsAssignableFrom(objectType);
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序){
var item=JObject.Load(读卡器);
开关(项[“类型”].Value()){
案例2:返回项.ToObject();
案例3:返回项.ToObject();
}
返回项[“类型”].Value();
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器){
抛出新的NotImplementedException();
}
}
请参阅此答案,了解为什么以及如何使ServiceStack保留类型信息,这些信息仅针对绝对需要的类型发出后期绑定的.NET类型信息,即接口
、后期绑定的对象
类型或抽象
类
解决方案是将Canine的基类更改为抽象类型:
abstract class Canine
{
public Types Type { get; set; }
}
谢谢你的回答,在我的特殊情况下,我认为最好还是坚持继承,即使我看到了你的链接。我的解决方案为需要它的类型创建了一个自定义反序列化器,并为请求创建了一种新格式,以避免ServiceStack自动反序列化我的DTO。