1. public class TestConverter : JsonConverter
  2. {
  3. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  4. {
  5. //Type valueType = value.GetType();
  6. //if (valueType.IsArray)
  7. //{
  8. // var jArray = new JArray();
  9. // foreach (var item in (IEnumerable)value)
  10. // jArray.Add(JToken.FromObject(item, serializer));
  11.  
  12. // jArray.WriteTo(writer);
  13. //}
  14. //else
  15. //{
  16. // JProperty typeHintProperty = TypeHintPropertyForType(valueType);
  17.  
  18. // var jObj = new JObject();
  19. // if (typeHintProperty != null)
  20. // jObj.Add(typeHintProperty);
  21.  
  22. // foreach (PropertyInfo property in valueType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
  23. // {
  24. // if (property.CanRead)
  25. // {
  26. // object propertyValue = property.GetValue(value, null);
  27. // if (propertyValue != null)
  28. // jObj.Add(property.Name, JToken.FromObject(propertyValue, serializer));
  29. // }
  30. // }
  31. // jObj.WriteTo(writer);
  32. //}
  33. }
  34. public override bool CanWrite => false;
  35.  
  36. public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
  37. JsonSerializer serializer)
  38. {
  39. // Load JObject from stream
  40. JObject jObject = JObject.Load(reader);
  41. Type targetType;
  42. JToken typeStr;
  43. //JToken varl;
  44. if (!jObject.TryGetValue("_t", out typeStr))
  45. {
  46. targetType = objectType;
  47. }
  48. else
  49. {
  50. var scrName = typeStr.ToString();
  51. if (scrName.Contains("."))
  52. {
  53. scrName = scrName.Substring(scrName.LastIndexOf(".", StringComparison.Ordinal)+);
  54. }
  55. targetType = PropertyHintTypeForStr(scrName);
  56. }
  57. // Displaying output.
  58. var target = Activator.CreateInstance(targetType);
  59. serializer.Populate(jObject.CreateReader(), target);
  60. return target;
  61. }
  62.  
  63. public override bool CanConvert(Type objectType)
  64. {
  65. return typeof(BaseTest).IsAssignableFrom(objectType);
  66. }
  67. //public override bool CanRead=>false;
  68.  
  69. private Type PropertyHintTypeForStr(string typeStr)
  70. {
  71. Type result;
  72. switch (typeStr)
  73. {
  74. case nameof(BaseTest):
  75. result = typeof(BaseTest);break;
  76. case nameof(TestA):
  77. result = typeof(TestA); break;
  78. case nameof(TestB):
  79. result = typeof(TestB); break;
  80. case nameof(TestC):
  81. result = typeof(TestC); break;
  82. case nameof(TestD):
  83. result = typeof(TestD); break;
  84. case nameof(TestE):
  85. result = typeof(TestE); break;
  86. case nameof(TestX):
  87. result = typeof(TestX); break;
  88. default:
  89. result = typeof(BaseTest); break;
  90. }
  91. return result;
  92. }
  93.  
  94. }

Newtonsoft.Json 序列化器的重写的更多相关文章

  1. ASP.NET MVC4 json序列化器

    ASP.NET MVC4中调用WEB API的四个方法 2012年06月07日00:05 it168网站原创 作者:廖煜嵘 编辑:景保玉 我要评论(0) [IT168技术]当今的软件开发中,设计软件的 ...

  2. Newtonsoft.Json 序列化和反序列化 以及时间格式 2 高级使用

    手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数 ...

  3. [C#][Newtonsoft.Json] Newtonsoft.Json 序列化时的一些其它用法

    Newtonsoft.Json 序列化时的一些其它用法 在进行序列化时我们一般会选择使用匿名类型 new { },或者添加一个新类(包含想输出的所有字段).但不可避免的会出现以下情形:如属性值隐藏(敏 ...

  4. C# 使用Newtonsoft.Json序列化自定义类型

    Json.Net是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Linq To JSON可以快速的读写Json,通过JsonSerializ ...

  5. c# 使用 Newtonsoft.Json 序列化json字符串以及,反序列化对象

    1. 序列化 对象 /** 使用 Newtonsoft.Json 序列化对象 **/ [WebMethod] public String getPersonInfos() { // 初始化数据 Lis ...

  6. Newtonsoft.Json序列化日期时间去T的几种方式。

    原文地址:MVC web api 返回JSON的几种方式,Newtonsoft.Json序列化日期时间去T的几种方式. http://www.cnblogs.com/wuball/p/4231343. ...

  7. MVC web api 返回JSON的几种方式,Newtonsoft.Json序列化日期时间去T的几种方式。

    原文链接:https://www.muhanxue.com/essays/2015/01/8623699.html MVC web api 返回JSON的几种方式 1.在WebApiConfig的Re ...

  8. Newtonsoft.Json 序列化踩坑之 IEnumerable

    Newtonsoft.Json 序列化踩坑之 IEnumerable Intro Newtonsoft.Json 是 .NET 下最受欢迎 JSON 操作库,使用起来也是非常方便,有时候也可能会不小心 ...

  9. NetworkComms V3 使用Json序列化器进行网络通信

    刚才在网上闲逛,偶然看到一篇文章 C#(服务器)与Java(客户端)通过Socket传递对象 网址是:http://www.cnblogs.com/iyangyuan/archive/2012/12/ ...

随机推荐

  1. Cloudstack系统配置(三)

    系统配置 CloudStack提供一个基于web的UI,管理员和终端用户能够使用这个界面.用户界面版本依赖于登陆时使用的凭证不同而不同.用户界面是适用于大多数流行的浏览器包括IE7,IE8,IE9,F ...

  2. vuejs2.0 vue实例的生命周期

    每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测(data observer).编译模版.挂载实例到 DOM ,然后在数据变化时更新 DOM .下图展示的就是一个v ...

  3. 设计模式之————依赖注入(Dependency Injection)与控制反转(Inversion of Controller)

    参考链接: 依赖注入(DI) or 控制反转(IoC) laravel 学习笔记 —— 神奇的服务容器 PHP 依赖注入,从此不再考虑加载顺序 名词解释 IoC(Inversion of Contro ...

  4. 15 Most Read Data Science Articles in 2015. So far …

    15 Most Read Data Science Articles in 2015. So far … We've compiled the latest set of "most rea ...

  5. Java并发编程原理与实战十三:JDK提供的原子类原理与使用

    原子更新基本类型 原子更新数组 原子更新抽象类型 原子更新字段 原子更新基本类型:   package com.roocon.thread.t8; import java.util.concurren ...

  6. Java并发编程原理与实战九:synchronized的原理与使用

    一.理论层面 内置锁与互斥锁 修饰普通方法.修饰静态方法.修饰代码块 package com.roocon.thread.t3; public class Sequence { private sta ...

  7. 手机中的js事件

    // 手势事件 touchstart //当手指接触屏幕时触发 touchmove //当已经接触屏幕的手指开始移动后触发 touchend //当手指离开屏幕时触发 touchcancel // 触 ...

  8. Elasticsearch技术解析与实战(二)文档的CRUD操作

    启动Elasticsearch和kibana 访问Elasticsearch:http://localhost:9200/?pretty 访问kibana:http://localhost:5601 ...

  9. soj1166. Computer Transformat(dp + 大数相加)

    1166. Computer Transformat Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description A sequenc ...

  10. HDU 2087 剪花布条 (KMP 不允许重叠的匹配)

    题目链接 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Inp ...