2017-07-09 46 views
0

在我的家庭自动化系统上,要创建带有文档的插件,我必须使用带有摘要的类。C#反序列化为动态类

我的插件与我的xiaomi网关通信以获取有关传感器的信息。所以有不同类型的传感器,如“sensor_ht”,“magnet”或“motion”。

对于每个传感器,有共同的属性和不同的数据部分。我在jon获得每个传感器的状态。

例如:

{"cmd":"report","model":"magnet","sid":"","short_id":40805,"data":" 
{\"status\":\"close\"}"} 
{"cmd":"report","model":"sensor_ht","sid":"","short_id":40805,"data":" 
{\"voltage\":\"3000\",\"temperature\":\"2367\",\"humidity,\":\"5285\"}"} 

所以我创建许多类这样的,每个传感器是在一个文件中。

sensor_ht.cs:

public class sensor_ht 
{ 
    public string model { get; set; } = "sensor_ht"; 
    public string sid { get; set; } 
    public string battery_type { get; set; } = "CR2032"; 
    public int battery { get; set; } 
    public sensor_ht.Report report { get; set; } 
} 

public class Report 
{ 
    public int voltage { get; set; } 
    public string temperature { get; set; } 
    public string humidity { get; set; } 
} 

magnet.cs:

public class magnet 
{ 
    public string model { get; set; } = "sensor_ht"; 
    public string sid { get; set; } 
    public string battery_type { get; set; } = "CR2032"; 
    public int battery { get; set; } 
    public magnet.Report report { get; set; } 
} 

public class Report 
{ 
    public int voltage { get; set; } 
    public string status { get; set; } 
} 

这是我的报告类:

public class Report 
{ 

     public string cmd { get; set; } 
     public string model { get; set; } 
     public string sid { get; set; } 
     public int short_id { get; set; } 
     public string token { get; set; } 
     public string data { get; set; } 
} 

反序列化的报告后,我初始化实例:

dynamic d = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("XiaomiSmartHome.Equipement." + read.model); 

但创建数据部分,我反序列化报告里的数据:

dynamic data2 = JsonConvert.DeserializeObject<dynamic>(read.data); 

我想这个数据是正确的报告类。我想:

d.report = data2; 

但最高审计机关,这是不可能的Newtonsoft.Json.Linq.JObject转换为XiaomiSmartHome.Equipement.Report

所以我的方式来处理,这是正确的?以及如何将数据部分反序列化为正确的报告?

谢谢!

回答

2

好吧,我终于找到了答案,我用:

var messageType = Type.GetType(deserialized.MessageType); 
var message = JsonConvert.DeserializeObject(
Convert.ToString(deserialized.Message), messageType); 
+0

您可以接受你自己的答案。 –