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

    }

  

猜你喜欢

转载自www.cnblogs.com/adamvv/p/9184956.html