2017-07-09 7 views
0

私のホームオートメーションシステムでは、ドキュメントを使用してプラグインを作成するために、クラスを要約とともに使用する必要があります。C#を動的クラスにデシリアライズ

私のプラグインは、センサーについての情報を得るために私のxiaomiゲートウェイと話します。だから、 "sensor_ht"、 "magnet"、 "motion"のような異なるタイプのセンサーがあります。

センサーごとに、共通の所有権と異なるデータ部分があります。私はジョンの各センサーのステータスを取得します。例えば

{"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 data2 = JsonConvert.DeserializeObject<dynamic>(read.data); 

私は、このデータが右レポートクラスになりたいです。

d.report = data2; 
しかし、それはので、これを処理する私の方法が正しいXiaomiSmartHome.Equipement.Report

にNewtonsoft.Json.Linq.JObjectを変換することは不可能だとサイス:私が試しましたか?また、データ部分を正しいレポートにデシリアライズする方法はありますか?

ありがとうございました!

答えて

2

[OK]を私は最終的に私が使用して、答えを見つけました:

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

あなたはあなた自身の答えを受け入れることができます。 –

関連する問題