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反序列化慢的比较多 ...
随机推荐
- 初识DOM(文档对象模型)
什么是DOM 什么叫做DOM呢? • DOM的全称是Document Object Model 文档对象模型,DOM定义了表示和修改文档所需的对象.这些对象的行为和属性以及这些对象之间的关系. • D ...
- js常用正则收集
1:非纯空白字符串且长度大于1: /^\s*\S+[\s\S]*$/ 右侧可以正常匹配:“ 11 1 1 a ” .“ 1 aa” . ...
- CSS3关于-webkit-tap-highlight-color属性
最近在写手机端,发现了一个问题,就是javascript点击元素时,在安卓手机上会出现半透明的蓝色背景,(经百度,在苹果手机上会出现半透明的灰色背景),后来通过百度找到了解决方案,就是利用CSS3的- ...
- Microsoft MVP MSDN Magazine 最新期分享
下载地址:http://1105insight.com/portal/wts/uemcmQeeDyaq%5Ev2gAe6c3b0Djd 可在线或下载查看
- OleDbConnection SqlConnection DB2Connection 区别
OleDbConnection适合于连接任何类型的数据库(如Oracle,SQL Server,ACCESS等),其命名空间为:using System.Data.OleDb;.而SqlConne ...
- CSS 小结笔记之滑动门技术
所谓的滑动门技术,就是指盒子背景能够自动拉伸以适应不同长度的文本.即当文字增多时,背景看起来也会变长. 大多数应用于导航栏之中,如微信导航栏: 具体实现方法如下: 1.首先每一块文本内容是由a标签与s ...
- 【第三组】心·迹 Alpha版本 成果汇报
GITHUB地址 https://github.com/shirley-wu/HeartTrace 目录 项目简介 成果概要 详细展示(多图预警) 代码结构及技术难点 问题与规划 1. 项目简介 心· ...
- 搭建企业级NFS网络文件共享服务
NFS服务简介 NFS是Network File System(网络文件系统).主要功能是通过网络让不同的服务器之间可以共享文件或者目录.NFS客户端一般是应用服务器(比如web,负载均衡等),可以 ...
- 【转】Linux思维导图
[原文]https://www.toutiao.com/i6591690511763898888/ 1.Linux学习路径: 2.Linux桌面介绍: 3.FHS(文件系统目录标准): 4.Linux ...
- 阿里云朱照远: AI打开新视界 8K时代已来!
2018年4月11-12日,2018亚太CDN峰会在北京隆重召开,大会由亚太CDN领袖论坛.电视云论坛.短视频论坛.视频云论坛.新技术论坛.运营商论坛.国际云论坛等7大部分组成.在亚太CDN领袖峰会上 ...