Json.NET序列化后包含类型,保证序列化和反序列化的对象类型相同(转载)
This sample uses the TypeNameHandlingsetting to include type information when serializing JSON and read type information so that the create types are created when deserializing JSON.
Sample
Types
public abstract class Business
{
public string Name { get; set; }
} public class Hotel : Business
{
public int Stars { get; set; }
} public class Stockholder
{
public string FullName { get; set; }
public IList<Business> Businesses { get; set; }
}
Usage
Stockholder stockholder = new Stockholder
{
FullName = "Steve Stockholder",
Businesses = new List<Business>
{
new Hotel
{
Name = "Hudson Hotel",
Stars =
}
}
}; string jsonTypeNameAll = JsonConvert.SerializeObject(stockholder, Formatting.Indented, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
}); Console.WriteLine(jsonTypeNameAll);
// {
// "$type": "Newtonsoft.Json.Samples.Stockholder, Newtonsoft.Json.Tests",
// "FullName": "Steve Stockholder",
// "Businesses": {
// "$type": "System.Collections.Generic.List`1[[Newtonsoft.Json.Samples.Business, Newtonsoft.Json.Tests]], mscorlib",
// "$values": [
// {
// "$type": "Newtonsoft.Json.Samples.Hotel, Newtonsoft.Json.Tests",
// "Stars": 4,
// "Name": "Hudson Hotel"
// }
// ]
// }
// } string jsonTypeNameAuto = JsonConvert.SerializeObject(stockholder, Formatting.Indented, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
}); Console.WriteLine(jsonTypeNameAuto);
// {
// "FullName": "Steve Stockholder",
// "Businesses": [
// {
// "$type": "Newtonsoft.Json.Samples.Hotel, Newtonsoft.Json.Tests",
// "Stars": 4,
// "Name": "Hudson Hotel"
// }
// ]
// } // for security TypeNameHandling is required when deserializing
Stockholder newStockholder = JsonConvert.DeserializeObject<Stockholder>(jsonTypeNameAuto, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
}); Console.WriteLine(newStockholder.Businesses[].GetType().Name);
// Hotel
演示
现在我们来做个演示,新建一个.NET Core控制台项目,然后我们定义两个类Car和Person如下:
using Newtonsoft.Json;
using System; namespace JsonNetTesting
{
public class Car
{
public string Name { get; set; }
public string Color { get; set; }
} public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Car carField;
public Car CarProperty
{
get;
set;
}
} class Program
{
static void Main(string[] args)
{
Person person = new Person()
{
Name = "Jack",
Age = ,
carField = new Car()
{
Name = "Benz",
Color = "Black"
},
CarProperty = new Car()
{
Name = "BMW",
Color = "White"
}
}; string json = JsonConvert.SerializeObject(person, new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.All,
Formatting = Formatting.Indented
}); Console.WriteLine(json); person = JsonConvert.DeserializeObject<Person>(json, new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.All
}); Console.WriteLine("Press key to end...");
Console.ReadKey();
}
}
}
可以看到当我们设置TypeNameHandling = TypeNameHandling.All后,本例中类Car和Person序列化为JSON后如下:
{
"$type": "JsonNetTesting.Person, JsonNetTesting",
"carField": {
"$type": "JsonNetTesting.Car, JsonNetTesting",
"Name": "Benz",
"Color": "Black"
},
"Name": "Jack",
"Age": 35,
"CarProperty": {
"$type": "JsonNetTesting.Car, JsonNetTesting",
"Name": "BMW",
"Color": "White"
}
}
可以看到类Car和Person被序列化为JSON后,都自动生成了一个"$type"属性,用来标识它们是从什么.NET类型序列化而来的。
Json.NET序列化后包含类型,保证序列化和反序列化的对象类型相同(转载)的更多相关文章
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- c# 表达式目录树拷贝对象(根据对象类型动态生成表达式目录树)
表达式目录树,在C#中用Expression标识,这里就不介绍表达式目录树是什么了,有兴趣可以自行百度搜索,网上资料还是很多的. 这里主要分享的是如何动态构建表达式目录树. 构建表达式目录树的代码挺简 ...
- 为什么用Object.prototype.toString.call(obj)检测对象类型?
最近做了做一些js面试25 Essential JavaScript Interview Questions*,其中第一道是:使用typeof bar === "object"检测 ...
- 用Object.prototype.toString.call(obj)检测对象类型原因分析
用Object.prototype.toString.call(obj)检测对象类型原因分析 更新时间:2018年10月11日 08:46:33 投稿:laozhang 我要评论 在本 ...
- js对象类型判断工具
对象类型判断工具 /** *类功能:对象类型判断工具 **/ var TypeUtil = { /** *方法说明:是否是数组 **/ isArray: function (obj) {//是否是数组 ...
- 用js解析经json序列化后的C#的DateTime类型数据
格式化日期(网上到处是),把下面的代码添加到jQuery.js文件中 //格式化日期 Date.prototype.format = function(format) { /* * eg:format ...
- 一:Newtonsoft.Json 支持序列化与反序列化的.net 对象类型;
导航目录: Newtonsoft.Json 概述 一:Newtonsoft.Json 支持序列化与反序列化的.net 对象类型: 二:C#对象.集合.DataTable与Json内容互转示例: ...
- EF 序列化实体为Json时的循环引用问题(不用自己写实体,不用匿名类型,不用EF的上下文属性)
自己写实体可以完美解决这个问题.(支持时间格式自定义) 用匿名类型也可以. 设置上下文方法如下: (jz为数据库上下文对象) jz.Configuration.ProxyCreationEnabled ...
- C# .NET的BinaryFormatter、protobuf-net、Newtonsoft.Json以及自己写的序列化方法序列化效率和序列化后的文件体积大小对比
测试结果如下图: 测试结果整理后: 结论: 1.这几个工具中,protobuf-net序列化和反序列化效率是最快的 2.BinaryFormatter和Newtonsoft.Json反序列化慢的比较多 ...
随机推荐
- 一张图看懂Mysql的join连接
INNER JOIN:当两个表中都匹配时返回行. LEFT JOIN:返回左表中的所有行,即使右表中没有匹配项也是如此. RIGHT JOIN:返回右表中的所有行,即使左表中没有匹配项也是如此. FU ...
- ArcGIS三种方式打断相交线------Planarize Lines工具
1. 只有一个layer图层时,我们只需要选择”Planarize Lines“工具即可. (1)选择工具栏”Customize“选项: (2)选择Customize工具栏中的”Toolbars“选项 ...
- vs2015 停 在 update kb2999226 一直不动
查找原因是因为装微软补丁,官网找到该补丁安装 Update for Windows 7 for x64-based Systems (KB2999226) https://www.microsoft. ...
- 代码操作Word时,目录自动更新的两种方法
最近的项目中有一个功能点为:根据分析数据库并生成报告.不过不是大数据.数据挖掘之类,报告的内容.组织方式都是事先固定下来的.实现的方式为,在普通word文档中插入书签制成模板,然后程序使用OpenXM ...
- 【SPL标准库专题(1)】 SPL简介
什么是SPL SPL是Standard PHP Library(PHP标准库)的缩写. 根据官方定义,它是"a collection of interfaces and classes th ...
- python自学——列表
#以下是我自己在联系列表中所编写的语句:names=["zangsan",'lisi','wangermazi','Xiaoliuzi','dabiaoge','牛erbiaodi ...
- Android图形显示之硬件抽象层Gralloc【转】
https://blog.csdn.net/yangwen123/article/details/12192401 FrameBuffer驱动程序分析文中介绍了Linux系统下的显示驱动框架,每个显示 ...
- ln 硬链接介绍
硬链接:在linux文件系统中多个文件名指向同一个索引节点(Inode)是正常允许的.硬链接文件就相当于文件的另一个入口. 硬链接的作用:允许一个文件拥有多个有效路径(多个入口),这样用户就可以建立硬 ...
- Django接收URL问号参数
问题概览: 一开始需求是想通过URL接收参数,但是一直固守通过正则表达式的方式接收参数,即形如(?P<parm>.+)的方式. 后面发现(/?)在http://regex101.com是可 ...
- 【爬坑】MySQL 无法启动
[说明] 启动 MySQL 的时候出现以下错误 [解决] 在网上查到了遇到相关问题的人的解决方法,参考连接 Mysql启动报错 原因是 MySQL 服务没启动,开启就好了. 最后分析之所以服务没开启, ...