JSON反序列化接口的问题

摘要:
今天在使用JSON序列化类时出现问题,原来类中有一个接口,在反序列化时不知道接口的实体是什么publicclassDevice:IComparer{privatestring_deviceid;privatestring_devicename;privatestring_deviceaddr="01";privatestring_friendlyname;privatestring_devdesc

今天在使用JSON序列化类时出现问题,原来类中有一个接口,在反序列化时不知道接口的实体是什么

public class Device : IComparer
{
private string _deviceid;
private string _devicename;
private string _deviceaddr = "01";
private string _friendlyname;
private string _devdescription;
private IBus _CommBus;
/// <summary>
/// 通信接口
/// </summary>
public IBus BusConnector
{
get { return _CommBus; }
set { _CommBus = value; }
}
/// <summary>
/// 设备编号-唯一性
/// </summary>
public string DeviceId
{
set { _deviceid = value; }
get { return _deviceid; }
}
/// <summary>
/// 设备名称
/// </summary>
public string DeviceName
{
set { _devicename = value; }
get { return _devicename; }
}
/// <summary>
/// 设备通信地址
/// </summary>
public string DeviceAddr
{
set { _deviceaddr = value; }
get { return _deviceaddr; }
}
/// <summary>
/// 发送指令到设备
/// </summary>
/// <param name="send"></param>
public virtual bool SendCmd(byte[] sendbytes)
{
return true;
}
public virtual bool DevOpen()
{
return _CommBus.Open();
}
#region 实现IComparer接口,按设备ID排序
public int Compare(object x, object y)
{
if ((x is Device) && (y is Device))
{
Device a = (Device)x;
Device b = (Device)y;
return a._deviceid.CompareTo(b._deviceid);
}
return 0;
}
#endregion End
}

Device类中,BusConnector为一通信接口,根据需要传入不同的通信方式实体,,正常反序列化时出现

Type is an interface or abstract class and cannot be instantiated” 这样的错误

方法一:在序列化时增加对应的说明

var settings = new JsonSerializerSettings();
settings.TypeNameHandling = TypeNameHandling.Objects;
JsonConvert.SerializeObject(entity, Formatting.Indented, settings);

方法二:增加转化类

public class Model
{
[JsonConverter(typeof(ConcreteTypeConverter<Something>))]
public ISomething TheThing { get; set; }
}

public class ConcreteTypeConverter<TConcrete> : JsonConverter 
{ 
public override bool CanConvert(Type objectType) 
{ //assume we can convert to anything for now 
 return true; 
} 
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
 { //explicitly specify the concrete type we want to create
 return serializer.Deserialize<TConcrete>(reader);
 }
 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
 { //use the default serialization - it works fine serializer.Serialize(writer, value);
 } 
}

方法三:直接使用JSON.NET上的在属性上增加

[JsonProperty(TypeNameHandling = TypeNameHandling.Auto)]
/// <summary>
/// 通信接口
/// </summary>
public IBus BusConnector
{
get { return _CommBus; }
set { _CommBus = value; }
}

这三种方法者有可实现性,其中方法三最方便,方法一可以实现,但每个对象之前增加对象类型。

解决方法参考:https://stackoverflow.com/questions/2254872/using-json-net-converters-to-deserialize-properties

https://stackoverflow.com/questions/8030538/how-to-implement-custom-jsonconverter-in-json-net-to-deserialize-a-list-of-base/8031283#8031283

免责声明:文章转载自《JSON反序列化接口的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux cat命令详解(连接文件并打印到标准输出设备上)抓包工具Fiddler的简单使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

spring aop实现拦截接口请求打印日志

 在spring配置  1编写自己的注解类 2.编写注解解析类 3.配置spring aop代理 (下面我使用注解 如使用配置 配置切点即可,有两种代理默认jdk代理 设置true 为cglib代理) //注解类 1 /** 2 * 自定义注解 拦截器 3 * @author 4 * 给需要监控的方法加上改注解,就可以实现该方法的日志记录 5...

代码题(50)— 字符串的排列

1、字符串排列 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 (1)交换元素位置 classSolution { public: vector<string> Permutation(stringstr)...

VB 的字符串处理函数

一、InStr 返回 Variant (Long),指定一字符串在另一字符串中最先出现的位置。 语法 InStr([start, ]string1, string2[, compare]) start 可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compar...

Eclipse中的TreeViewer类和ListViewer类

TreeViewer和TableViewer在使用上还是有很多相似之处.TreeViewer中冶有TableViewer中的过滤器和排序器.具体使用看TableViewer中的使用. 和Table有JFace的扩展TableViewer一样,Tree也有一个JFace中的扩展,那就是TreeViewer.因为TreeViewer和TableViewer继承...

C#基础知识

C#基础 1、面向对象、面向接口、面向方向编程的区别: 面向对象:强调对具有相同行为和属性事物的封装,更注重封装的完整性和功能的完整性 面向接口:定义要实现某类功能要实现的统一规范,而具体实现过程由实现该接口的类型决定 面向方面:主要提供与业务逻辑无关的操作。比如系统中多个地方要使用到的文件上传功能,可以使用面向方向的思想在所有上传文件之前对文件的大小、格...

新浪股票接口AndroidSDK

昨天想到一个点子,需要访问股票行情。于是在网上搜了一下免费的股市行情的接口。发现新浪股票的数据接口比较稳定,于是就用它了。 网上对于新浪股票的数据接口介绍比较详细,并且实现也很简单,所以花了一下午就基本完成了。想到大家开发Android应用可能也会需要访问股市行情,特此将资料整理在此,并附上Javadoc文档和一个小Demo,以便后来人开发更为便捷。   ...