C#反序列化为动态类

时间:2017-07-09 08:24:56

标签: c# json

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

我的插件与我的xiaomi网关交谈以获取有关传感器的信息。所以有不同类型的传感器,如“sensor_ht”,“磁铁”或“运动”。

对于每个传感器,有共同的属性和不同的数据部分。我在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

是不可能的。

所以我处理这个问题的方法是对的吗?以及如何将数据部分反序列化为正确的报告?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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