今天在使用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反序列化接口的问题的更多相关文章

  1. C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone

    C# Json反序列化   Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...

  2. json数据测试接口

    json数据测试接口:http://www.xiaoqiang.org/tools/JsonView/?1348068433

  3. atitit.基于http json api 接口设计 最佳实践 总结o7

    atitit.基于http  json  api 接口设计 最佳实践 总结o7 1. 需求:::服务器and android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通参数 meth,p ...

  4. 服务端提供的JSON数据接口与用户端接收解析JSON数据

    JSON格式的服务接口:http://www.cnblogs.com/visec479/articles/4118338.html 首先来了解下JSON格式解析 json结构的格式就是若干个 键/值( ...

  5. C# Json反序列化处理

    最近换工作了 从客户端转到Web端 第一个任务就是去别人的页面上抓取数据 用到的是JSON 因为他们网站json的格式有点怪 所以 就在JSON反序列化上面 花了一点时间 首先用到的工具是http:/ ...

  6. Json反序列化

    迟来的Json反序列化   源码发布 搞了一个下午,终于搞定改了这个号称中国的github...以后源码直接在这里发布了(英文实在太烂了) https://code.csdn.net/jy023050 ...

  7. C#在Json反序列化中处理键的特殊字符

    假设有如下Json 数据: 1.{ 2."id" : 1, 3."@value" : "this a @", 4."$p" ...

  8. C# Json反序列化

    Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自行在nuget中导入 Jso ...

  9. .net Json 反序列化时,属性带点

    .net Json 反序列化时,属性带点 使用[JsonProperty("xxx.xxx")] static void Main(string[] args) { string ...

  10. Newtonsoft.Json反序列化(Deserialize)出错:Bad JSON escape sequence

    使用Newtonsoft.Json反序列化收到的字串为JObject或其它支持的数据模型,有时错误,提示如下: Bad JSON escape sequence: \c. Path , positio ...

随机推荐

  1. java技术系列(三) 多线程之并行处理和同步

    java同步器: 1,Semaphone: 信号量 2,CountDownLatch:倒计数门栓 3,CyclicBarrier 障栅 : 4,Exchanger :

  2. Win10微软官方镜像iso文件下载

    1.转到下载页面2.按F12后点击小窗口左上角的手机图标3:刷新页面开始下载(win10.iso:链接)

  3. unity meta pass

    简单说就是在meta pass计算 albedo,emission,specular 3个值 光照烘焙,gi计算间接光照时都会用到这些值 Shader "MyShader/SampleLig ...

  4. K8s试验环境搭建(一)

    一.kubernetes简介 1.什么是kubernetes? kubernetes是google公司用go语言开发的一套容器编排系统,简称k8s:它主要用于容器编排:所谓容器编排简单的我们可以理解为 ...

  5. HDLbits—— 3-input look-up-table

    // a 3-input look-up-table // In this question, you will design a circuit for an 8x1 memory, // wher ...

  6. c# TPL中的数据竞争-Data Race

    例一: Parallel.For(1, arraySize, i => { ary[i] = ary[i] + ary[i - 1]; });如下: object _lock = new obj ...

  7. Python打包时包含静态文件处理方法

    Python打包时包含静态文件处理方法 使用场景 已搭建了PyPI私有库,上传公共库包含静态文件,如需要使用sql静态文件初始化数据库. 打包python包,给其他人使用,但项目中包含静态文件,如ht ...

  8. 在linux环境中安装node,npm,express

    linux安装node 连接运程命令: 进入usr/local 文件夹 cd /usr/local 1.下载 wget https://nodejs.org/dist/v14.17.6/node-v1 ...

  9. Ubunutu的apt-get软件下载工具的国内镜像源

    Ubunutu安装时,默认没有给apt-get配置国内镜像源,其默认配置的镜像源国内不能访问到,安装软件处处失败,所以我们需要配置国内镜像源: 首先避免出错,我们先备份原sources.list文件, ...

  10. [2007年NOIP普及组] 纪念品分组

    元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不 ...