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

时间:2016-03-03 20:31:16

标签: c# .net json serialization json.net

我有一个基于我从第三方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 个答案:

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