今天在使用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. C#动态创建对象和其属性

    dynamic contact = new ExpandoObject(); contact.Name = "Patrick Hines"; contact.Phone = &qu ...

  2. ANT+JMETER+Jenkins 接口自动化

    Linux环境下搭建:ANT+JMETER+Jenkins 接口自动化 一.准备环境: 1.下载 JDK1.8 JDK下载地址:https://www.oracle.com/java/technolo ...

  3. spider_ip代理

    title: spider_ip代理 author: 杨晓东 permalink: spider_ip代理 date: 2021-10-02 11:27:04 categories: - 投篮 tag ...

  4. 'umi' 不是内部或外部命令,也不是可运行的程序 或批处理文件或umi: command not found

    问题 'umi' 不是内部或外部命令,也不是可运行的程序 或批处理文件或umi: command not found 解决方法 参考链接:https://blog.csdn.net/weixin_40 ...

  5. python生成随机中文姓名和拼音

    def sayhello(): print('hellopython') import pinyin import random def random_name(): # 删减部分,比较大众化姓氏 f ...

  6. Collections.synchronizedList使用方法

    ArrayList众所周知ArrayList是非线程安全的,在多线程的情况下,向list插入数据的时候,可能会造成数据丢失的情况.并且一个线程在遍历List,另一个线程修改List,会报Concurr ...

  7. PLSQL REPLACE 函数替换操作

    oracle REPLACE 函数是用另外一个值来替代串中的某个值. 例如,可以用一个匹配数字来替代字母的每一次出现. REPLACE 的格式如下: REPLACE ( char, search_st ...

  8. 肖sir__网页线下面试

    第一题: 设计一下两个两位数相加的测试用例,说只能写数字不要写文字 第二题 淘宝订单怎么测试 功能测试: 1.测试订单输入的类型 2.测试金额数量:可创建等价类划分 3.测试库存数量变更 4.测试订单 ...

  9. Google Chrome 离线安装包官方下载

    我们参照 Google Chrome帮助中的<下载和安装 Google Chrome>,在这里找到官方最新版离线安装包的下载地址:备用 Chrome 安装程序,历史版本请通过版本号的方式下 ...

  10. ULR1 B. 【ULR #1】光伏元件

    一个n∗nn∗n的0101矩阵ai,jai,j,有些位置可以修改,代价为ci,jci,j.要求进行一些修改之后满足:设clicli为第ii行的11的个数,cricri为第ii列的11的个数,要求cli ...