栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将JSON反序列化为抽象类

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将JSON反序列化为抽象类

一个人可能不想使用TypeNameHandling(因为一个人想要更紧凑的json或想为类型变量使用一个特定的名称而不是“ $
type”)。同时,如果一个人想要将基类反序列化为多个派生类中的任何一个而不事先知道要使用哪个类,则customerCreationConverter方法将不起作用。

一种替代方法是在基类中使用int或其他类型并定义JsonConverter。

[JsonConverter(typeof(baseConverter))]abstract class base{    public int ObjType { get; set; }    public int Id { get; set; }}class DerivedType1 : base{    public string Foo { get; set; }}class DerivedType2 : base{    public string Bar { get; set; }}

然后,基类的JsonConverter可以根据对象的类型反序列化该对象。复杂之处在于,为了避免堆栈溢出(JsonConverter反复调用其自身),必须在此反序列化期间使用自定义合同解析器。

public class baseSpecifiedConcreteClassConverter : DefaultContractResolver{    protected override JsonConverter ResolveContractConverter(Type objectType)    {        if (typeof(base).IsAssignableFrom(objectType) && !objectType.IsAbstract) return null; // pretend TableSortRuleConvert is not specified (thus avoiding a stack overflow)        return base.ResolveContractConverter(objectType);    }}public class baseConverter : JsonConverter{    static JsonSerializerSettings SpecifiedSubclassConversion = new JsonSerializerSettings() { ContractResolver = new baseSpecifiedConcreteClassConverter() };    public override bool CanConvert(Type objectType)    {        return (objectType == typeof(base));    }    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)    {        JObject jo = JObject.Load(reader);        switch (jo["ObjType"].Value<int>())        { case 1:     return JsonConvert.DeserializeObject<DerivedType1>(jo.ToString(), SpecifiedSubclassConversion); case 2:     return JsonConvert.DeserializeObject<DerivedType2>(jo.ToString(), SpecifiedSubclassConversion); default:     throw new Exception();        }        throw new NotImplementedException();    }    public override bool CanWrite    {        get { return false; }    }    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)    {        throw new NotImplementedException(); // won't be called because CanWrite returns false    }}

而已。现在,您可以使用序列化/反序列化任何派生类。您还可以在其他类中使用基类,并对其进行序列化/反序列化,而无需任何其他工作:

class Holder    {        public List<base> Objects { get; set; }    }string json = @"        [ {     ""Objects"" :      [         { ""ObjType"": 1, ""Id"" : 1, ""Foo"" : ""One"" },         { ""ObjType"": 1, ""Id"" : 2, ""Foo"" : ""Two"" },     ] }, {     ""Objects"" :      [         { ""ObjType"": 2, ""Id"" : 3, ""Bar"" : ""Three"" },         { ""ObjType"": 2, ""Id"" : 4, ""Bar"" : ""Four"" },     ] },        ]"; List<Holder> list = JsonConvert.DeserializeObject<List<Holder>>(json); string serializedAgain = JsonConvert.SerializeObject(list); Debug.WriteLine(serializedAgain);


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/447159.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号