使用JSON.NET将JSON字符串或数组属性有条件地反序列化为C#对象?

4

我有一个基于第三方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字符串?
2个回答

3

这个很简单 - 你可以将alarmSummary设置为对象,然后拥有一个分离的属性来评估alarmSummary并根据其值返回null或数组。

    public object alarmSummary { get; set; }

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

你会使用什么方法进行反序列化? - Edin
@Edin,如果他在POCO类上有alarmSummary属性并反序列化该类的实例(这是我使用ServiceStack.Text JSON库的方法),我建议他这样做。如果他直接反序列化到变量,则您在答案中提出的建议更好,而且还使用了Json.Net库的特定功能。 - nikib3ro

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>() };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接