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

本文关键字:JSON 反序列化 属性 对象 数组 字符串 有条件 NET 使用 | 更新日期: 2023-09-27 18:37:12

我有一个定义的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 字符串并手动转换它?

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

这个应该很容易 - 您可以将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>() };