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

Posted

技术标签:

【中文标题】如何判断 JSON 结果是不是有对象或数组?【英文标题】:How to tell if JSON result has object or array?如何判断 JSON 结果是否有对象或数组? 【发布时间】:2014-12-03 21:13:44 【问题描述】:

对不起各位。我对编写代码很陌生...

我正在用 c# 编写一个 powershell cmdlet,它会访问 API 并获取 JSON 作为响应。

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

有时候,可以

"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 是否有一个用于“结果”的对象或一个用于“结果”的数组。

根据检查,我想调用一个方法,以 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"。

【问题讨论】:

【参考方案1】:

不确定这是否是处理它的最佳方法,但您可以使用以下方法:

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 

【讨论】:

哦!甜的!这让它变得容易多了!非常感谢@bit。【参考方案2】:

这将起作用:

   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;
            

【讨论】:

谢谢。这也是一个不错的选择!【参考方案3】:

这是一个相当老的问题,但如果您不想使用 Newtonsoft.Json 命名空间,我已经得到了 System.Text.Json 命名空间的答案。 JsonDocument 中还有一个 Parse 方法,您可以在其中确定根元素的类。

var JDocument = System.Text.Json.JsonDocument.Parse(json);
if (JDocument.RootElement.ValueKind == JsonValueKind.Object)

    //Object


if (JDocument.RootElement.ValueKind == JsonValueKind.Array)

    //Array or List

【讨论】:

【参考方案4】:

您可以为此创建 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; 

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

【讨论】:

以上是关于如何判断 JSON 结果是不是有对象或数组?的主要内容,如果未能解决你的问题,请参考以下文章

js判断数组是不是为空

YII对象结果转为数组或直接输入JSON格式

js报错:为空或不是对象

如何判断js里的对象是不是存在

c#如何获得返回json数组中的数组

如何通过 ajax php 调用返回包含 json 对象的数组/json 对象?