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/ ...
随机推荐
- C#基础总结
1.执行.NET应用程序时经历的几个步骤 用C#编写应用程序代码 把应用程序代码编译为中间语言代码(MSIL),存储在程序集中 使用JIT编译器将MSIL编译为本机代码 在托管的公共语言运行库(CLR ...
- (转)spring boot注解 --@EnableAsync 异步调用
原文:http://www.cnblogs.com/azhqiang/p/5609615.html EnableAsync注解的意思是可以异步执行,就是开启多线程的意思.可以标注在方法.类上. @Co ...
- winform学习笔记-文档路径
获取应用程序路径 //获取当前进程的完整路径,包含文件名(进程名).string str = this.GetType().Assembly.Location;result: X:\xxx\xxx\x ...
- 苹果公布WWDC2016时间 并做了个程序员情怀网页
新浪手机讯 4月19日上午消息,苹果公司今日正式确定2016年全球开发者大会(WWDC)开幕时间:6月13-17日,并做了个非常有意思的代码风格页面. 网友戏称这个页面只有程序员们才能看懂,它的首页是 ...
- linux学习 命令ll后字段的解释(转)
原文链接:http://jz20080153.blog.sohu.com/161554070.html ls -l 列表信息详解 我们平时用ls -l 命令查看一个目录下的文件和子目录的详悉信息时,会 ...
- asp.net自己创建的app_code文件夹中的类不能访问的解决办法
在Web应用程序中不能通过右键项目-〉”添加“-〉”添加ASP.NET文件夹“方式添加 .因为Web应用程序中App_Code就不存在 .不过可以通过手动的方式创建,添加一个文件夹命名为App_Cod ...
- 【转】Weblogic的集群
原文链接:http://www.cnblogs.com/HondaHsu/p/4267972.html 一.Weblogic的集群 还记得我们在第五天教程中讲到的关于Tomcat的集群吗? 两个tom ...
- ES6中块作用域之于for语句是怎样的?
在ES6中新加了快作用域的概念(C语言就有,作为类c语言的js,当然应该加上),算是很好理解. { let i; } console.log(i);// i is not defined 在代码块当中 ...
- img图片下面出现莫名的下边距解决办法
图片底部的空隙实际上涉及行内元素的布局模型,图片默认的垂直对齐方式是基线,而基线的位置是与字体相关的.所以在某些时候,图片底部的空隙可能是 2px,而有时可能是 4px 或更多.不同的 font-si ...
- ICML历年Best Papers
作者:我爱机器学习原文链接:ICML历年Best Papers ICML (Machine Learning)(1999-2016) 2016 Dueling Network Architecture ...