zoukankan      html  css  js  c++  java
  • Newtonsoft.Json 序列化器的重写

     public class TestConverter : JsonConverter
        {
            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                //Type valueType = value.GetType();
                //if (valueType.IsArray)
                //{
                //    var jArray = new JArray();
                //    foreach (var item in (IEnumerable)value)
                //        jArray.Add(JToken.FromObject(item, serializer));
    
                //    jArray.WriteTo(writer);
                //}
                //else
                //{
                //    JProperty typeHintProperty = TypeHintPropertyForType(valueType);
    
                //    var jObj = new JObject();
                //    if (typeHintProperty != null)
                //        jObj.Add(typeHintProperty);
    
                //    foreach (PropertyInfo property in valueType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
                //    {
                //        if (property.CanRead)
                //        {
                //            object propertyValue = property.GetValue(value, null);
                //            if (propertyValue != null)
                //                jObj.Add(property.Name, JToken.FromObject(propertyValue, serializer));
                //        }
                //    }
                //    jObj.WriteTo(writer);
                //}
            }
            public override bool CanWrite => false;
    
            public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
                JsonSerializer serializer)
            {
                // Load JObject from stream
                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);
                return target;
            }
    
    
            public override bool CanConvert(Type objectType)
            {
                return typeof(BaseTest).IsAssignableFrom(objectType);
            }
            //public override bool CanRead=>false;
    
            private Type PropertyHintTypeForStr(string typeStr)
            {
                Type result;
                switch (typeStr)
                {
                    case nameof(BaseTest):
                        result = typeof(BaseTest);break;
                    case nameof(TestA):
                        result = typeof(TestA); break;
                    case nameof(TestB):
                        result = typeof(TestB); break;
                    case nameof(TestC):
                        result = typeof(TestC); break;
                    case nameof(TestD):
                        result = typeof(TestD); break;
                    case nameof(TestE):
                        result = typeof(TestE); break;
                    case nameof(TestX):
                        result = typeof(TestX); break;
                    default:
                        result = typeof(BaseTest); break;
                }
                return result;
            }
    
        }
  • 相关阅读:
    vue中点击复制粘贴功能
    node.js之爬虫
    node.js初识12
    webapp定位
    Nginx工作原理和优化
    Android 命名规范 (提高代码可以读性)
    VS2015如何自定义类模板、我的模板——原来这么简单!
    VS2010中新控件的编程------颜色按钮类和颜色对话框
    WinForm创建自定义控件
    Android--MVP设计模式实践
  • 原文地址:https://www.cnblogs.com/daxiongblog/p/6373486.html
Copyright © 2011-2022 走看看