Newtonsoft.Json 处理多态类型的反序列化
Newtonsoft.Json的序列化和反序列化很成熟也很好用, 最近在处理多态类型的反序列化中遇到了问题, 反序列化后只能到基类,而得不到也不能转换到子类。从网上查询了一番后,需要写一个创建类型的Converter, 下面我们一步一步来:
1. 首先说明类型的定义, 为了做这个实验,我定义了一个基类和两个子类, 然后我要序列化的对象包含了这个基类的集合。
namespace LexSry
{
using Newtonsoft.Json;
using System.Collections.Generic;
class DemoData
{
[JsonProperty("demoId")]
public int DemoId { get; set; } [JsonProperty("demos")]
public List<DemoBase> Demos { get; set; }
} public class DemoBase
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
} public class DemoA : DemoBase
{
[JsonProperty("color")]
public string Color { get; set; } } public class DemoB: DemoBase
{
[JsonProperty("size")]
public double[] Size { get; set; }
}
}
2. 序列化,反序列化方法。反序列化时使用 JsonConvert.DeserializeObject<T>(string value, param JsonConverter[] converter)。 通过自己定义JsonConverter来实现创建相应的子类。
在本演示中, 我首先创建了抽象类 JsonCreationConverter<T>:JsonConverter ,
其次, 针对于DemoBase的解析, 我创建了 JsonDemoConverter:JsonCreationConverter<DemoBase>
class JsonParser3
{
public static void WriteJson(object t, string file)
{
JsonSerializer serializer = new JsonSerializer();
using (StreamWriter sw = new StreamWriter(file))
{
using (JsonWriter writer = new JsonTextWriter(sw))
{
serializer.Serialize(writer, t);
}
}
} public static void ReadJson<T>(string file, out T obj)
{
JsonSerializer serializer = new JsonSerializer();
using (StreamReader sr = new StreamReader(file))
{
obj = JsonConvert.DeserializeObject<T>(sr.ReadToEnd(),new JsonDemoConverter());
}
}
} public abstract class JsonCreationConverter<T>:JsonConverter
{
protected abstract T Create(Type objectType, JObject jsonObject);
public override bool CanConvert(Type objectType)
{
return typeof(T).IsAssignableFrom(objectType);
} public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jsonObject = JObject.Load(reader);
var target = Create(objectType, jsonObject);
serializer.Populate(jsonObject.CreateReader(), target);
return target;
} public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
} public class JsonDemoConverter:JsonCreationConverter<DemoBase>
{
protected override DemoBase Create(Type objectType, JObject jsonObject)
{
var typeName = jsonObject["type"].ToString();
switch(typeName)
{
case "A":
return new DemoA();
case "B":
return new DemoB();
default: return null;
}
}
}
}
3. 在代码中实现将内存中的对象序列化到test.json中, 然后,从test.json中将数据反序列化到内存对象nData:
DemoData data = new DemoData()
{
DemoId = ,
Demos = new List<DemoBase>()
{
new DemoA() {Id=, Name="demoA", Type="A",Color="red" },
new DemoB() {Id=, Name="", Type="B",Size= new double[]{ ,} }
}
}; JsonParser3.WriteJson(data, "test.json"); DemoData nData = new DemoData();
JsonParser3.ReadJson<DemoData>("test.json", out nData);
4. test.json中的数据:
{
"demoId": 1,
"demos": [
{
"color": "red",
"id": 1,
"name": "demoA",
"type": "A"
},
{
"size": [ 10.0, 10.0 ],
"id": 2,
"name": "",
"type": "B"
}
]
}
5. 反序列化后, 内存中得到的对象nData
Newtonsoft.Json 处理多态类型的反序列化的更多相关文章
- Newtonsoft.Json 转换DateTime类型为字符串时,串内部会有一个T。解决方案
使用Newtonsoft.Json 转换DateTime类型时,若使用标准转换,则字符串内会有一个T(虽然再转换成DateTime没有问题). 若要转换成DateTime没有T,可以加上特性: pub ...
- C# 使用Newtonsoft.Json序列化自定义类型
Json.Net是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Linq To JSON可以快速的读写Json,通过JsonSerializ ...
- Newtonsoft.Json序列化Enum类型
[JsonConverter(typeof(StringEnumConverter))] public StringAlignment TextAlign { get => textAlign; ...
- 利用Newtonsoft.Json实现Json序列化与反序列化
在项目中用到了Newtonsoft.Json来实现序列化和反序列化,在这里写下实现代码. 1.创建类用于排除不序列化的属性 public class ExcludePropertiesContract ...
- Newtonsoft.Json 的基本用法
Ø 前言 说起 C# 对 JSON 的操作(序列化与反序列化),大家都会想到 JavaScriptSerializer.DataContractJsonSerializer 与 Newtonsoft ...
- C# dynamic类型序列化和反序列化之Newtonsoft.Json,动态解析远端返回的jSON数据
一.说明 1.Newtonsoft.Json 中的Linq To Json中提供了方便的json数据查询.修改等操作. 例如:JObject,JArray 2.在JObject.FromObject( ...
- 一:Newtonsoft.Json 支持序列化与反序列化的.net 对象类型;
导航目录: Newtonsoft.Json 概述 一:Newtonsoft.Json 支持序列化与反序列化的.net 对象类型: 二:C#对象.集合.DataTable与Json内容互转示例: ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...
- C# dynamic类型序列化和反序列化之Newtonsoft.Json
原文:C# dynamic类型序列化和反序列化之Newtonsoft.Json 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011127019/ ...
随机推荐
- php crc32,md5,sha1,mhash测试结果
总结:php 自带hash mhash 用于散列只能加密 扩展mcrypt 用于加解密 对文件加密有的文件会隐藏换行,或者读取方式等影响导致结果不一致. 1.crc32 php: a.系统crc ...
- merge,join,concat
merge交集 join并集 concat axis=0 竖着连 axis=1 横着连
- laravel cookie写入
$cookie = cookie('cookie_name', 'value', 5); $data = ['title'=>'hello world']; ...
- jquery中链式调用原理
(1).链式调用 $("#mybtn").css("width","100px") .css("height",&quo ...
- centos 6.6编译安装git-2.7.0 最新git编译安装
系统环境:centos6.6 1,安装准备 yum -y install gcc zlib-devel openssl-devel perl cpio expat-devel gettext-deve ...
- linux命令每日一练习 解压命令
.tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gun ...
- mac idea快捷键
新买的mac,如果默认使用idea快捷键,因为用eclipse,完全转不过来,所以荡下别人整理好的资源放在目录下,以备查看 原文:https://my.oschina.net/sunzy/blog/3 ...
- $(document).ready() 与 window.onload 之间的区别
1.执行时机 window.onload 是网页中所有的元素都加载到浏览器后才执行 $(document).ready() 是dom完全就续就可以调用 例如:如果给一副图片添加点击事件,window. ...
- Android ListView加载更多
先看效果: ListView的footer布局: <?xml version="1.0" encoding="utf-8"?> <Relati ...
- 【转】Matlab练习程序(各向异性扩散)
http://www.cnblogs.com/tiandsp/archive/2013/04/18/3029468.html 主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留 ...