博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# 序列化Dictionary,支持value为对像类型的反序列化
阅读量:5272 次
发布时间:2019-06-14

本文共 2648 字,大约阅读时间需要 8 分钟。

要反序列化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
vtmp = new Dictionary
(); foreach (string key in ((PiItem)target).Keys) { if(((PiItem)target).FieldValues[key] is JObject) { vtmp.Add(key, JsonConvert.DeserializeObject
(((PiItem)target).FieldValues[key].ToString())); } } foreach (KeyValuePair
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

你可能感兴趣的文章
2012暑期川西旅游之总结
查看>>
Linux发行版的排行
查看>>
12010 解密QQ号(队列)
查看>>
2014年辛星完全解读Javascript第一节
查看>>
装配SpringBean(一)--依赖注入
查看>>
daydayup2 codeforces143C
查看>>
ANT打包J2EE项目war包
查看>>
UESTC-我要长高 DP优化
查看>>
java选择文件时提供图像缩略图[转]
查看>>
方维分享系统二次开发, 给评论、主题、回复、活动 加审核的功能
查看>>
Matlab parfor-loop并行运算
查看>>
string与stringbuilder的区别
查看>>
2012-01-12 16:01 hibernate注解以及简单实例
查看>>
iOS8统一的系统提示控件——UIAlertController
查看>>
PAT甲级——1101 Quick Sort (快速排序)
查看>>
python创建进程的两种方式
查看>>
1.2 基础知识——关于猪皮(GP,Generic Practice)
查看>>
迭代器Iterator
查看>>
java易错题----静态方法的调用
查看>>
php建立MySQL数据表
查看>>