2017-03-16 59 views
3

我將一個JSON API響應反序列化到一個類中 - 但是在代碼運行後類是空的,即根本沒有反序列化。反序列化的類是空白的 - JSON C#

這裏是JSON的一個例子,叫的responseText:

{"ON":{"Date":"3/16/2017 10:12:51 AM","PARAM1":"84","PARAM2":"31597.535"},"OFF":{"Date":"3/16/2017 9:05:53 AM","PARAM3":"0","PARAM4":"0"}} 

我有兩個類:

public class ON 
{ 
public Date {get; set;} 
public string PARAM1 {get; set;} 
public string PARAM2 {get; set;} 
} 
public class OFF 
{ 
public Date {get; set;} 
public string PARAM3 {get; set;} 
public string PARAM4 {get; set;} 
} 

我deserialise這裏:

ON class1 = JsonConvert.DeserializeObject<ON>(responsetext); 
OFF class2 = JsonConvert.DeserializeObject<OFF>(responsetext); 

但這些類空。我究竟做錯了什麼?

+0

對於今後的工作中,它可能是更容易讓一個程序寫JSON類的ONOFF類您。 [JSON2C#](http://json2csharp.com) – vipersassassin

回答

10

您試圖將相同的JSON反序列化爲兩個不同的類,就好像反序列化器會奇蹟般地知道要使用哪個JSON部分。你需要一個包裝類:

public class Message 
{ 
    public ON ON { get; set; } 

    public OFF OFF { get; set; } 
} 

然後deserialise這樣的:

var message = JsonConvert.DeserializeObject<Message>(responsetext); 

現在,您可以訪問兩個message.ONmessage.OFF

screenshot of running example

+0

好的謝謝@Stijn - 然後我該如何引用?我需要更改爲反序列化的代碼? 即。 'ON class1 = JsonConvert.DeserializeObject (responsetext);' – reviloSlater

+0

@reviloSlater查看更新後的答案。 – Stijn

+0

@reviloSlater我也假設你的實際代碼有'public DateTime Date {get; set;}'而不是'public Date {get;設置;}'?因爲後者不會編譯。 – Stijn

1

你在你的反應是什麼不是On或Off的單個實例,而是包含其中一個的對象。當你告訴JsonConvert將這個包裝器反序列化爲一個或另一個類時,它會實例化一個類的副本,然後查看JSON字符串中要設置的屬性,但是找不到任何內容,因爲包含對象既不是On也不是關閉並且沒有任何一個領域。所以,它只是讓你回到空的物體。

您需要第三個類包含一個ON實例和一個OFF實例,並反序列化爲該類型;那麼你會得到你想要的結果。或者,你可以自己做一點解析,將每個對象的JSON解壓到單獨的字符串中,然後對它們進行反序列化(但是這首先會破壞使用Newtonsoft.JSON的目的)。

0

您嘗試反序列化的Json對象中的ON和OFF是對象的屬性。

創建相匹配的JSON對象

public class ONOFF 
{ 
    public ON ON { get; set; } 
    public OFF OFF { get; set; } 
} 

,然後deserialise響應成

ONOFF class3 = JsonConvert.DeserializeObject<ONOFF>(responsetext);