原文:Newtonsoft.Json高级篇:TypeNameHandling设置

此示例使用TypeNameHandling 设置在序列化JSON和读取类型信息时包含类型信息,以便在反序列化JSON时创建创建类型

Sample

  1. public abstract class Business
  2. {
  3. public string Name { get; set; }
  4. }
  5.  
  6. public class Hotel : Business
  7. {
  8. public int Stars { get; set; }
  9. }
  10.  
  11. public class Stockholder
  12. {
  13. public string FullName { get; set; }
  14. public IList<Business> Businesses { get; set; }
  15. }

使用

  1. Stockholder stockholder = new Stockholder
  2. {
  3. FullName = "Steve Stockholder",
  4. Businesses = new List<Business>
  5. {
  6. new Hotel
  7. {
  8. Name = "Hudson Hotel",
  9. Stars =
  10. }
  11. }
  12. };
  13.  
  14. string jsonTypeNameAll = JsonConvert.SerializeObject(stockholder, Formatting.Indented, new JsonSerializerSettings
  15. {
  16. TypeNameHandling = TypeNameHandling.All
  17. });
  18.  
  19. Console.WriteLine(jsonTypeNameAll);
  20. // {
  21. // "$type": "Newtonsoft.Json.Samples.Stockholder, Newtonsoft.Json.Tests",
  22. // "FullName": "Steve Stockholder",
  23. // "Businesses": {
  24. // "$type": "System.Collections.Generic.List`1[[Newtonsoft.Json.Samples.Business, Newtonsoft.Json.Tests]], mscorlib",
  25. // "$values": [
  26. // {
  27. // "$type": "Newtonsoft.Json.Samples.Hotel, Newtonsoft.Json.Tests",
  28. // "Stars": 4,
  29. // "Name": "Hudson Hotel"
  30. // }
  31. // ]
  32. // }
  33. // }
  34.  
  35. string jsonTypeNameAuto = JsonConvert.SerializeObject(stockholder, Formatting.Indented, new JsonSerializerSettings
  36. {
  37. TypeNameHandling = TypeNameHandling.Auto
  38. });
  39.  
  40. Console.WriteLine(jsonTypeNameAuto);
  41. // {
  42. // "FullName": "Steve Stockholder",
  43. // "Businesses": [
  44. // {
  45. // "$type": "Newtonsoft.Json.Samples.Hotel, Newtonsoft.Json.Tests",
  46. // "Stars": 4,
  47. // "Name": "Hudson Hotel"
  48. // }
  49. // ]
  50. // }
  51.  
  52. // for security TypeNameHandling is required when deserializing
  53. Stockholder newStockholder = JsonConvert.DeserializeObject<Stockholder>(jsonTypeNameAuto, new JsonSerializerSettings
  54. {
  55. TypeNameHandling = TypeNameHandling.Auto
  56. });
  57.  
  58. Console.WriteLine(newStockholder.Businesses[].GetType().Name);
  59. // Hotel

具体内容详见官方文档:https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm

解决的具体问题:可以支持复杂的继承结构:

  1. string jsonTypeNameAll = JsonConvert.SerializeObject(xx, Formatting.Indented, new JsonSerializerSettings
  2. {
  3. TypeNameHandling = TypeNameHandling.All,
  4. ReferenceLoopHandling = ReferenceLoopHandling.Ignore
  5. });
  6.  
  7. var oo= JsonConvert.DeserializeObject<StartConfig>(File.ReadAllText(path), new JsonSerializerSettings
  8. {
  9. TypeNameHandling = TypeNameHandling.All,
  10. ReferenceLoopHandling = ReferenceLoopHandling.Ignore
  11. });
  12. ISupportInitialize iSupportInitialize = (ISupportInitialize) oo;
  13. iSupportInitialize?.EndInit();
  14.  
  15. var o9=oo.GetComponent<InnerConfig>();//实例化StartConfig对象的子对象

Newtonsoft.Json高级篇:TypeNameHandling设置的更多相关文章

  1. 再谈Newtonsoft.Json高级用法

    上一篇Newtonsoft.Json高级用法发布以后收到挺多回复的,本篇将分享几点挺有用的知识点和最近项目中用到的一个新点进行说明,做为对上篇文章的补充. 阅读目录 动态改变属性序列化名称 枚举值序列 ...

  2. Newtonsoft.Json高级用法之枚举中文转义

    最近看博客园中 焰尾迭的两篇关于"Newtonsoft.Json高级用法"的文章受到了很多人的评论,一度登入到头条推荐. 今天我就不再重复焰尾迭博文中的一些提过的Newtonsof ...

  3. Newtonsoft.Json高级用法(转)

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

  4. 【转】 Newtonsoft.Json高级用法

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

  5. Newtonsoft.Json高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的字段名称

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

  6. 转:Newtonsoft.Json高级用法

    原文地址:http://www.cnblogs.com/yanweidie/p/4605212.html 手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多 ...

  7. Newtonsoft.Json高级用法,json序列号,model反序列化,支持序列化和反序列化DataTable,DataSet,Entity Framework和Entity,字符串

    原文地址:https://www.cnblogs.com/yanweidie/p/4605212.html 手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口 ...

  8. 【Json】Newtonsoft.Json高级用法

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

  9. [转]Newtonsoft.Json高级用法

    本文转自:http://www.cnblogs.com/yanweidie/p/4605212.html 手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多 ...

随机推荐

  1. NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info

    NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_part.h> UF_initialize ...

  2. mysql 导出导入数据 -csv

    MySql数据库导出csv文件命令: mysql> select first_name,last_name,email from account into outfile 'e://output ...

  3. Python 爬虫-抓取中小企业股份转让系统公司公告的链接并下载

    系统运行系统:MAC 用到的python库:selenium.phantomjs等 由于中小企业股份转让系统网页使用了javasvript,无法用传统的requests.BeautifulSoup库获 ...

  4. word 文献标题自动编号

    来自:word中自动编号和多级编号的使用 选中标题或段落,点击鼠标右键,在编号菜单内选择适合的自动编号样式.或者在窗口上方的“开始”选项卡中选择编号样式.如果对已选的编号样式不满意,可以照以上方法直接 ...

  5. mac的终端运行ifconfig

    lo0:loopback回环地址一般是127.0.0.0,loopback指本地环回接口(或地址),亦称回送地址().此类接口是应用最为广泛的一种虚接口,几乎在每台路由器上都会使用. gif0: so ...

  6. HDU-1850-Being a Good Boy in Spring Festival-nim博弈

    一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场悄悄给爸爸买个小礼物主动地 强烈地 要求洗一次碗某一天早起 给爸妈用心地做回早餐 如果愿意 你还可以和爸妈 ...

  7. String类的substring()方法

    截取字符串,在java语言中的用法 1.  public String substring(int beginIndex) 返回一个新字符串,它是此字符串的一个子字符串.该子字符串始于指定索引处的字符 ...

  8. 全面解析HTML5优缺点

    HTML5是当下最主流的网页标准,它的出现给在线应用和手机游戏开发者带来了不少新机会.基于HTML5,开发者可以制作自己的网络游戏,而这个游戏无 论你在PC.手机还是平板电脑上,无论你用Chrome. ...

  9. HtmlCleanner结合xpath用法(转载)

    HtmlCleaner cleaner = new HtmlCleaner(); TagNode node = cleaner.clean(new URL("http://finance.s ...

  10. linux下使用自带mail发送邮件

    linux下使用自带mail发送邮件 mailx工具说明: linux可以通过安装mailx工具,mailx是一个小型的邮件发送程序,一般可以通过该程序在linux系统上,进行监控linux系统状态并 ...