我有一个定义的C#对象,该对象基于我从第三方API获得的非常复杂的JSON。这是其中的一部分:
{"alarmSummary":"NONE"}
C# 中的相应属性为:
public string alarmSummary {get; set;}
我会通过使用我典型的 JSONConvert 从 JSON.NET 转换它:
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 字符串并手动转换它?
这个应该很容易 - 您可以将alarmSummary
设置为对象,然后具有单独的属性来计算alarmSummary
并根据值返回 null 或数组。
public object alarmSummary { get; set; }
protected string[] alarmSummaryCasted
{
get
{
if (alarmSummary is String)
return null;
else
return (string[]) alarmSummary;
}
}
如果您只期望这两种组合,则可以使用 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>() };