我有一个基于我从第三方API获得的非常复杂的JSON的定义的C#对象。这是它的一部分:
{"alarmSummary":"NONE"}
C#中的相应属性是:
public string alarmSummary {get; set;}
我会通过使用JSON.NET中的典型JSONConvert来转换它:
var alarms = JSONConvert.DeserializeObject<MyClass>(jsonString);
但是,API会以这种格式将警报作为数组放置,如果没有任何字符串则将其设置为“NONE”:
{"alarmSummary" : ["AHHH Something went wrong!!", "I'm on fire!!"]}
这意味着在C#中需要:
public string[] alarmSummary {get; set;}
如果可以的话,我会让JSONConvert将“NONE”字符串反序列化为只有一个条目的数组。有没有办法在这个属性上设置条件,或者我是否必须采用整个复杂的JSON字符串并手动转换它?
答案 0 :(得分:3)
这个应该很简单 - 您可以将alarmSummary
设置为对象,然后使用单独的属性来评估alarmSummary
并根据值返回null或数组。
public object alarmSummary { get; set; }
protected string[] alarmSummaryCasted
{
get
{
if (alarmSummary is String)
return null;
else
return (string[]) alarmSummary;
}
}
答案 1 :(得分:1)
如果您只期望这两种组合,则可以使用dynamic关键字并检查反序列化对象:
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>() };