繁体   English   中英

自定义JSON反序列化器ServiceStack

[英]Custom JSON deserializer ServiceStack

我试图反序列化JSON格式的对象集合,但有一个公共的父类,但是当ServiceStack反序列化我的请求时,我会得到集合中父类类型的所有元素,而不是每个单独的子类。 是否可以创建自定义反序列化器并避免ServiceStack自动反序列化。

例:

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();
    }
}

有关为何应避免在DTO中进行继承以及如何使ServiceStack保留类型信息的信息,请参见此答案,该信息仅对于绝对需要它的类型(即Interfaces ,后期object类型或abstract类)发出后绑定的.NET类型信息。 。

解决方案是将Canine的基类更改为抽象类型:

abstract class Canine
{
    public Types Type { get; set; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM