如何判断 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"] 是单个对象时打印"对象"。
不确定这是否是处理它的最佳方法,但您可以使用这样的东西:
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; }
}
我想我们甚至可以使这个转换器通用,但这只是一个简单的例子。