我正在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”。
答案 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; }
}
我想我们甚至可以使此转换器具有通用性,但这只是一个简单的示例。