2016-03-03 36 views
3

我有一個定義的C#對象,基於從第三方API獲取的非常複雜的JSON。這裏是一塊吧:使用JSON.NET有條件地將JSON字符串或數組屬性反序列化爲C#對象?

{"alarmSummary":"NONE"} 

C#中的相應屬性是:

public string alarmSummary {get; set;} 

而且我會得到這個通過使用來自JSON.NET我的典型JSONConvert轉換:

var alarms = JSONConvert.DeserializeObject<MyClass>(jsonString); 

但是,API將以這種格式將報警以陣列的形式進行報警,而當沒有任何字符串時,API將以「無」的方式發出警報:

{"alarmSummary" : ["AHHH Something went wrong!!", "I'm on fire!!"]} 

在C#這意味着它需要是:

public string[] alarmSummary {get; set;} 

如果我可以,我只想有JSONConvert反序列化「NONE」串逼到一個條目的數組。有沒有一種方法來設置此屬性的條件,或者我將不得不採取整個複雜的JSON字符串,並將其轉換?

回答

2

這一個應該很容易 - 你可以設置你的alarmSummary爲對象,然後有獨立的屬性,評估alarmSummary並返回null或數組取決於值。

public object alarmSummary { get; set; } 

    protected string[] alarmSummaryCasted 
    { 
     get 
     { 
      if (alarmSummary is String) 
       return null; 
      else 
       return (string[]) alarmSummary; 
     } 
    } 
+0

你會用什麼方法來反序列化? – Edin

+0

@Edin我建議如果他有'alarmSummary'作爲POCO類的屬性並反序列化該類的實例(這是我用ServiceStack.Text JSON庫做的)。如果他直接反序列化爲變量,那麼你在回答中提出的建議會更好,另外它還會使用Json.Net庫的特定功能。 – kape123

1

如果你期待只有這兩個組合,你可以利用動態關鍵字的時間並反序列化對象:

string json = "{\"alarmSummary\":\"NONE\"}"; 
//string json = "{\"alarmSummary\" : [\"AHHH Something went wrong!!\", \"I'm on fire!!\"]}"; 

string[] alarmSummary; 
dynamic obj = JsonConvert.DeserializeObject(json); 
if (obj.alarmSummary.Type == JTokenType.Array) 
    alarmSummary = obj.alarmSummary.ToObject<string[]>(); 
else 
    alarmSummary = new[] { (string)obj.alarmSummary.ToObject<string>() }; 
相關問題