如何判断JSON结果是否有对象或数组?

时间:2014-10-09 03:44:07

标签: c# json linq

抱歉,伙计们。我很擅长编写代码......

我正在c#中编写一个powershell cmdlet,它会扩展到API并获取JSON作为响应。

根据我对API的调用,返回JSON数组或单个JSON对象

Sometiems,它可以是

{"result": [
{
"id": "24095",
"hostid": "24094",
"name": "host1.fqdn.com",
"clustered": "false",
"type": "VM",
"ipaddress" : "192.168.1.184"
},
{
"id": "24097",
"hostid": "24096",
"name": "host2.fqdn.com",
"clustered": "true",
"type": "VM",
"ipaddress" : "192.168.1.185"
}
]
}

有时候可能

{"result": {
"id": "24095",
"hostid": "24094",
"name": "host1.fqdn.com",
"clustered": "false",
"type": "VM",
"ipaddress" : "192.168.1.184"
}
}

我正在试图弄清楚如何使用JSON.NET,我可以弄清楚返回的json是否有“result”对象或“result”数组。

根据检查,我想调用一种以CSV格式打印出对象或数组的方法

我希望编写一个通用方法,将所有键打印为CSV标头,将值打印为CSV的行。

但我遇到的第一件事就是搞清楚我的JSON对象是否有数组或只有对象

我试过

JObject jsonres = JObject.Parse(strResponse);
JObject appobj = (JObject)jsonres.SelectToken("result");

Console.WriteLine(appobj.Type.ToString());

结果

  

无法将“Newtonsoft.Json.Linq.JArray”类型的对象强制转换为类型   'Newtonsoft.Json.Linq.JObject'。

当appobj [“result”]是一个数组并且工作正常并且在appobj [“result”]是单个对象时打印“Object”。

3 个答案:

答案 0 :(得分:6)

不确定这是否是处理它的最佳方式,但你可以使用类似的东西:

if ( jsonres.SelectToken("result") is JObject )
{ ... }
else if ( jsonres.SelectToken("result") is JArray)
{ ... }
else
{ ...some exception perhaps }

编辑:轻微的即兴创作

if ( jsonres.SelectToken("result") is JObject )
{ //Create JArray with the lone "result" in it }

//Use the JArray 

答案 1 :(得分:3)

这将有效:

   JObject jsonres = JObject.Parse(json);
   Console.WriteLine(jsonres["result"].Type);

了解它是对象还是数组。您可以在枚举上使用switch-case:

            switch(jsonres["result"].Type)
            {
                case JTokenType.Object:
               //Do something if it's an object
                    break;
                case JTokenType.Array:
                //Do something if it's an array
                    break;
            }

答案 2 :(得分:0)

您可以为此创建JsonConverter。

public class SingleOrListJsonConverter : JsonConverter
{
    public override bool CanWrite => false;

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var token = JToken.ReadFrom(reader);
        switch (token.Type)
        {
            case JTokenType.Object:
                var item = token.ToObject<MyResultType>();
                return new List<MyResultType>(new[] {item});
            case JTokenType.Array:
                return token.ToObject<List<MyResultType>>();
            default:
                return new List<MyResultType>();
        }
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<MyResultType>) || objectType == typeof(MyResultType);
    }
}

然后使用此转换器装饰您的媒体资源

public class MyClass
{
    [TypeConverter(typeof(SingleOrListJsonConverter))]
    public MyResultType Result { get; set; }
}

我想我们甚至可以使此转换器具有通用性,但这只是一个简单的示例。