在我的家庭自动化系统上,要创建带有文档的插件,我必须使用带有摘要的类。
我的插件与我的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
是不可能的。所以我处理这个问题的方法是对的吗?以及如何将数据部分反序列化为正确的报告?
谢谢!
答案 0 :(得分:2)
好的我终于找到了答案,我用了:
var messageType = Type.GetType(deserialized.MessageType);
var message = JsonConvert.DeserializeObject(
Convert.ToString(deserialized.Message), messageType);