我们正在使用一个外部API,该API使用对象名称“ Data”返回其结果。此“数据”可以表示两个不同的对象-一个以json对象数组的形式表示,另一个以单个json对象的形式表示。
我创建了两个单独的c#类,分别表示JSON对象数据和ac#根对象类,以在使用JsonConvert.DeserializeObject进行转换时捕获JSON对象...如何在C#中正确表示这些对象,请参见下面的结果示例:
下面是产生1个API调用的示例
{
success:true,
Data:[{id:1,name:"Paul"},{id:2,name:"neville"},{id:3,name:"jason"}]
}
public class User
{
public int id { get; set; }
public string name { get; set; }
}
public class ApiResponse
{
public bool success { get; set; }
public List<User> Data { get; set; }
}
下面是生成的API调用的示例2
{
success:true,
Data:{id:1,classSize:30,minAge:25, maxAge:65}
}
public class AgeClass
{
public int id { get; set; }
public int classSize { get; set; }
public int minAge { get; set; }
public int maxAge { get; set; }
}
public class ApiResponse
{
public bool success { get; set; }
public AgeClass Data { get; set; }
}
我将如何构造ApiResponse类来满足返回的通用“数据”对象json字符串-这样我就可以使用通用的“ JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync(),设置);” >
答案 0 :(得分:3)
您可以通过为Data
属性添加泛型类型参数来使类为泛型:
public class ApiResponse<T>
{
public bool success { get; set; }
public T Data { get; set; }
}
然后在反序列化时使用它:
var result = JsonConvert.DeserializeObject<ApiResponse<AgeClass>>(myJson ...);
var result = JsonConvert.DeserializeObject<ApiResponse<List<User>>>(myJson ...);
答案 1 :(得分:2)
我建议考虑您实际上有两种类型的JSON响应。 您还可以从ApiResponse基类继承它们:
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string json1 = @"{
""success"":true,
""Data"":[{id:1, name:""Paul""},{id:2,name:""neville""},{id:3,name:""jason""}]
}";
string json2 = @"{
""success"":true,
""Data"":{id:1,classSize:30,minAge:25, maxAge:65}
}";
string j = json1; //json2;
JObject jo = JObject.Parse(j);
ApiResponse parsed;
if (jo["Data"].Type == JTokenType.Array)
parsed = jo.ToObject<ApiUsersResponse>();
else
parsed = jo.ToObject<ApiAgeResponse>();
Console.ReadKey();
}
}
class User
{
public int id { get; set; }
public string name { get; set; }
}
class AgeClass
{
public int id { get; set; }
public int classSize { get; set; }
public int minAge { get; set; }
public int maxAge { get; set; }
}
class ApiResponse
{
public bool success { get; set; }
}
class ApiUsersResponse : ApiResponse
{
public List<User> Data { get; set; }
}
class ApiAgeResponse : ApiResponse
{
public AgeClass Data { get; set; }
}
}