如何判断 JSON 结果是包含对象还是数组

本文关键字:对象 包含 数组 结果是 JSON 何判断 判断 | 更新日期: 2023-09-27 18:25:57

对不起,伙计们。我对编写代码很陌生...

我正在用 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"] 是单个对象时打印"对象"。

如何判断 JSON 结果是包含对象还是数组

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

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 

这将起作用:

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

找出它是对象还是数组。您可以在枚举上使用开关盒:

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

这是一个相当古老的问题,但是如果您不想使用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
}
你可以

为此创建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; }
}

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

相关文章: