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结果添加用户或课程

提前感谢您的帮助

洛杉矶警察局有几件事:

  • 对于当前代码,假设您使用的是默认序列化程序,当您反序列化时,您不会捕获“items”,因为您要反序列化到未定义“items”属性的CursorResult。序列化程序不会自动知道派生类型。我还建议将UserList和CoursesList类重命名为UserCursorResult/CourseCursorResult。这些类不是列表,它们包含列表

  • 下面是区分json序列化(子)类型的代码:

    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
            }