c# 序列化Dictionary,支持value为对像类型的反序列化

要反序列化Dictionary内容中的对像类型键值,需要实现自定义转换器:XXXJsonConverter :JsonConverter

 

public class xxxJsonConverter : JsonConverter
    { 
        public override bool CanWrite {
            get {
                return false;
            }
        }
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            string valu = reader.Path;
            JsonToken jt = reader.TokenType;
            // Load JObject from stream
            if (jt== JsonToken.Null)
                return null;
            JObject jObject = JObject.Load(reader);
            Type targetType;
            JToken typeStr;
            //JToken varl;
            if (!jObject.TryGetValue("_t", out typeStr))
            {
                targetType = objectType;
            }
            else
            {
                var scrName = typeStr.ToString();
                if (scrName.Contains("."))
                {
                    scrName = scrName.Substring(scrName.LastIndexOf(".", StringComparison.Ordinal) + 1);
                }
                targetType = PropertyHintTypeForStr(scrName);
            }
            // Displaying output. 
            var target = Activator.CreateInstance(targetType);
            serializer.Populate(jObject.CreateReader(), target);
            Dictionary<string, object> vtmp = new Dictionary<string, object>();
            foreach (string key in ((PiItem)target).Keys)
            {
                if(((PiItem)target).FieldValues[key] is JObject)
                {
                    vtmp.Add(key, JsonConvert.DeserializeObject<ComplexItem>(((PiItem)target).FieldValues[key].ToString()));
                }
            }
            foreach (KeyValuePair<string, object> kv in vtmp)
            {
                ((PiItem)target)[kv.Key] = kv.Value;
            }
            return target;
        }

        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(PiItem);
        }
        private Type PropertyHintTypeForStr(string typeStr)
        {
            Type result;
            switch (typeStr)
            {
                case nameof(PiItem):
                    result = typeof(PiItem); break;
                case nameof(ComplexItem):
                    result = typeof(ComplexItem); break;
                default:
                    result = null; break;
            }
            return result;
        }

    }

  

转载于:https://www.cnblogs.com/adamvv/p/9184956.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值