今天在使用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. mybatis bind 标签 覆盖 复杂对象的某个属性值 问题。

    需求: 有四个sql 都需要用一个 相同的where 条件,于是定义了一个sql 标签. 然后在每个sql中使用 <include refid="myWhereSql"> ...

  2. unity 变体 随手记

    1 #pragma multi_compile AAA BBB#pragma multi_compile CCC DDDAAA CCCAAA DDDBBB CCCBBB DDD------------ ...

  3. mybatis -plus基础

  4. el-table实现翻页选择和回看

    html <el-table ... <!-- row-key的row.id是你的行唯一标识,一般用id,翻页选的关键 --> :row-key="row => ro ...

  5. chrome 请停用以开发者

    链接:https://pan.baidu.com/s/1YhWINGlUVyTE5XyBVIGW_Q 提取码:23t2 转载至   https://www.cnblogs.com/it-tsz/p/9 ...

  6. kubernetes 部署 flannel 网络插件

    flannel 的yaml文件 官方网址: https://kubernetes.io/docs/concepts/cluster-administration/addons/ 第一种下载方式:yam ...

  7. linux下安装OpenJDK 1.8

    1. 使用yum查找jdk: yum search java|grep jdk [root@iasdasd jvm]# yum search java|grep jdk Repository extr ...

  8. Codeforces Round #728 (Div. 2) C. Great Graphs

    Great Graphs 题意 给你一个数组\(d\),\(d[i]\)表示从节点\(1\)到其他各个节点的最短路的长度,然后你可以对这个图进行加边(可以是负边),但不允许存在一个权值和为负数的回路. ...

  9. Luogu P2375 [NOI2014 D2]动物园 kmp

    P2375 动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物 ...

  10. Myeclipse导入项目提示已存在(Some projects cannot be imported because they already exist in the workspace)

    原因:在项目空间的文件夹中没有删除干净之前的项目,之前的项目和要导入的项目的名字相同,所以导致无法将项目导入.需要在项目空间中将有关的旧文件都清理干净. 1.将项目空间文件夹中的项目删除. 2.到:\ ...