C# 多态结果的JSON反序列化
C# 多态结果的JSON反序列化,c#,json,rest,deserialization,C#,Json,Rest,Deserialization,我有以下问题,为了找到一个合适的解决方案,我快发疯了。 我必须使用两个RESTful API,它们返回除了items结构之外的相同结构 让我举两个例子: { "hasmoredata":true, "current_page": 1, "page_size": 20, "total_pages": 5, "items": [ { "user_id": "1", "usern
我有以下问题,为了找到一个合适的解决方案,我快发疯了。
我必须使用两个RESTful API,它们返回除了items结构之外的相同结构
让我举两个例子:
{
"hasmoredata":true,
"current_page": 1,
"page_size": 20,
"total_pages": 5,
"items": [
{
"user_id": "1",
"username": "carl",
"first_name": "carl",
}
]
}
{
"hasmoredata":true,
"current_page": 1,
"page_size": 10,
"total_pages": 2,
"items": [
{
"course_id": "10",
"course_name": "Math",
"duration": "3h",
}
]
}
我想有两个类,它们扩展了收集公共属性的抽象类。类似这样的东西(在C中):
但我不知道如何编写AddItem函数,以便根据API结果添加用户或课程
提前感谢您的帮助
洛杉矶警察局有几件事:
string yourJsonString=@“{'hasmoredata':true,'current_page':
1,'page_size':20,'total_page':5,'items':[{'user_id':
‘1’、‘用户名’:‘卡尔’、‘名字’:‘卡尔’}];
JSchemaGenerator生成器=新的JSchemaGenerator();
JSchema userSchema=generator.Generate(typeof(UsersList));
JSchema courseSchema=generator.Generate(typeof(CoursesList));
JToken jObject=jObject.Parse(yourJsonString);
if(jObject.IsValid(courseSchema))
{
CoursesList courseList=JsonConvert.DeserializeObject(yourJsonString);
//与课程专家合作
}
else if(jObject.IsValid(userSchema))
{
UsersList userList=JsonConvert.DeserializeObject(yourJsonString);
//使用UsersList做一些事情
}
另外,您需要Newtonsoft.Json.Schema来使用JSchemaGenerator。非常感谢Yuli,这对我帮助很大!但是,如果不使用if case,如何泛化GetEntireResult函数呢??提前谢谢!
public abstract class CursorResult
{
[JsonProperty("current_page")]
public int CurrentPage { get; set; }
[JsonProperty("page_size")]
public int PageSize { get; set; }
[JsonProperty("total_pages")]
public int TotalPages { get; set; }
[JsonProperty("hasmoredata")]
public bool HasMoreData{ get; set; }
}
public class UsersList : CursorResult
{
[JsonProperty("items")]
List<User> Users { get; set; }
}
public class CoursesList : CursorResult
{
[JsonProperty("items")]
List<Courses> Courses { get; set; }
}
private CursorResult GetEntireResult(string apiURL)
{
Cursor c = new Cursor(1, pageSize);
CursorResult result = TryDeserializeCursorResult(CallRestFulAPI(apiURL + c.GetCursorParametersString, Method.GET));
c.Hashcode = result.CursorHashCode;
while (result.HasMoreData)
{
c.CurrentPage += 1;
result.AddItems(TryDeserializeCursorResult(CallRestFulAPI(apiURL + c.ParametersString, Method.GET)));
}
return result;
}
string yourJsonString = @"{ 'hasmoredata':true,'current_page':
1,'page_size': 20,'total_pages': 5,'items': [{'user_id':
'1','username': 'carl','first_name': 'carl'}]}";
JSchemaGenerator generator = new JSchemaGenerator();
JSchema userSchema = generator.Generate(typeof(UsersList));
JSchema courseSchema = generator.Generate(typeof(CoursesList));
JToken jObject = JObject.Parse(yourJsonString);
if (jObject.IsValid(courseSchema))
{
CoursesList courseList = JsonConvert.DeserializeObject<CoursesList>(yourJsonString);
//do stuff with CourseList
}
else if (jObject.IsValid(userSchema))
{
UsersList userList = JsonConvert.DeserializeObject<UsersList>(yourJsonString);
//do stuff with UsersList
}