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/ ...
随机推荐
- 简单学会.net remoting
简介 •.net remoting是.net在RPC分布式应用的技术.首先,客户端通过 remoting访问通道以获得服务端对象,再通过代理解析为客户端对象,通过通道来实现远程对象的调用. 原理 •远 ...
- 运行DbVisualizer报the java_home environment viariable does not point to a working 32-bit JDK OR JRE错误
报这个错误的根本原因就是DbVisualizer和JDK的版本不一致,那么知道原因,修改起来就方便了,要么修改DbVisualizer的版本,要么修改JDK的版本. 1.JDK7 64位 那么就在Db ...
- [原创]C#引用C++编译的dll
一.DllImportAttribute 1.属性介绍 using System; using System.Reflection; using System.Security; namespace ...
- python安装supervisor
1.下载supervisor-3.3.1.tar.gz http://pan.baidu.com/s/1dEPhGEd 2.下载meld3-1.0.2.tar.gz http://pan.b ...
- 关于java对Excel的读取
/*注意:读取的Excel文件 请另存为2003版本的Excel,否则可能会报错别忘记导入第三方的jar包*/package com.zzp.ExcelParse;import jxl.Cell;im ...
- cacti web页面访问 settings出错
查看apache错误日志: 错误信息Mon Dec 26 11:00:48.241653 2016] [:error] [pid 32607] [client 192.168.10.79:65009] ...
- Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project LogTest: Compilation failure -> [Help 1]
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default ...
- C++变量初始化问题
初始化和赋值的区别 在C++中,变量初始化和赋值操作符是两个完全不同的概念. 初始化不是赋值,初始化的含义是创建变量分配存储空间时为其赋一个初始值,而赋值的含义是把内存空间的当前值擦除,用一个新值代替 ...
- Bootstrap<基础二> 网格系统
Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 什么是网格(Grid)? 摘自维基百科: 在平面设计中,网格 ...
- excel导出
查询的结果结 List list = commissionMService.getMapper().meishengExport(paramMap); // 第一步,创建一个webbook,对应一个 ...