Json反对模型MVC

时间:2016-04-07 17:36:15

标签: c# json asp.net-mvc serialization

这是我的Json对象

{
  "id":5,
  "url":"http://localhost:8001/api/courses/5",
  "name":"Professional Experience II",
  "duration":"5.0",
  "description":"The course will talk in depth about every thing",
  "tutor": {
             "id":2,
             "email":"TA@mymail.com",
             "userName":"TA",
             "firstName":"T",
             "lastName":"A",
             "gender":0
           },
  "subject":
           {
             "id":2,
             "name":"Science"
           }
  }

我的模特就在这里

public class CourseModel
    {
        public int Id { get; set; }
        public string Url { get; set; }
        public string Name { get; set; }
        public double Duration { get; set; }
        public string Description { get; set; }
        public TutorModel Tutor { get; set; }
        public SubjectModel Subject { get; set; }
    }

这就是我得到这个对象的方式。我能够获取jsonObject但无法将其反序列化为相应的模型

string url = "http://localhost:8001/api/courses/5";
HttpResponseMessage responseMessage = await client.GetAsync(url);
if (responseMessage.IsSuccessStatusCode)
{
  var responseData = responseMessage.Content.ReadAsStringAsync().Result;        
  var data = JsonConvert.DeserializeObject<List<CourseModel>>(responseData);
  return View(data);
}
return View("Error:);

我得到的错误是

  

无法反序列化当前的JSON对象(例如{“name”:“value”})   进入类型   'System.Collections.Generic.List`1 [Learning.Web.Models.CourseModel]'   因为该类型需要一个JSON数组(例如[1,2,3])来反序列化   正确。要修复此错误,请将JSON更改为JSON数组   (例如[1,2,3])或更改反序列化类型以使其正常   .NET类型(例如,不是整数的基本类型,不是集合   类似于数组或List的类型,可以从JSON反序列化   宾语。 JsonObjectAttribute也可以添加到类型中以强制它   从JSON对象反序列化。路径'id',第1行,第6位。

我正在使用WebApi,我不确定我在这里做错了什么..任何帮助将不胜感激

更新:

根据Shyju和Habib的回答,如果我将其反序列化为单个实例但是如果我将URL更改为

,则它确实有效
string url = "http://localhost:8001/api/courses";

并将其反序列化为List,我得到相同的错误,这里是json对象

   {  
       "totalCount":32,
       "totalPages":4,
       "prevPageLink":"",
       "nextPageLink":"http://localhost:8001/api/courses?page=1&pageSize=10",
       "results":[  
          {  
             "id":1,
             "url":"http://localhost:8001/api/courses/1",
             "name":"History Teaching Methods 1",
             "duration":3.0,
             "description":"The course will talk in depth about: History Teaching Methods 1",
             "tutor":{  
                "id":1,
                "email":"h@outlook.com",
                "userName":"A,
                "firstName":"A",
                "lastName":"J",
                "gender":0
             },
             "subject":{  
                "id":1,
                "name":"History"
             }
          },
          {  
             "id":2,
             "url":"http://localhost:8001/api/courses/2",
             "name":"History Teaching Methods 2",
             "duration":5.0,
             "description":"The course will talk in depth about: History Teaching Methods 2",
             "tutor":{  
                "id":1,
                "email":"A.Jo@fg.com",
                "userName":"AJo",
                "firstName":"A",
                "lastName":"Jo",
                "gender":0
             },
             "subject":{  
                "id":1,
                "name":"History"
             }
          },
          {  
             "id":3,
             "url":"http://localhost:8001/api/courses/3",
             "name":"History Teaching Methods 3",
             "duration":5.0,
             "description":"The course will talk in depth about: History Teaching Methods 3",
             "tutor":{  
                "id":1,
                "email":"A@outlook.com",
                "userName":"A",
                "firstName":"A",
                "lastName":"J",
                "gender":0
             },
             "subject":{  
                "id":1,
                "name":"History"
             }
          },
          {  
             "id":4,
             "url":"http://localhost:8001/api/courses/4",
             "name":"Professional Experience 1 (Mathematics/Science)",
             "duration":5.0,
             "description":"The course will talk in depth about: Professional Experience 1 (Mathematics/Science)",
             "tutor":{  
                "id":2,
                "email":"T.A@mymail.com",
                "userName":"T",
                "firstName":"T",
                "lastName":"A",
                "gender":0
             },
             "subject":{  
                "id":2,
                "name":"Science"
             }
          },
          {  
             "id":5,
             "url":"http://localhost:8001/api/courses/5",
             "name":"Professional Experience 2 (Mathematics/Science)",
             "duration":5.0,
             "description":"The course will talk in depth about: Professional Experience 2 (Mathematics/Science)",
             "tutor":{  
                "id":2,
                "email":"TA@mymail.com",
                "userName":"T",
                "firstName":"T",
                "lastName":"A",
                "gender":0
             },
             "subject":{  
                "id":2,
                "name":"Science"
             }
          },
          {  
             "id":6,
             "url":"http://localhost:8001/api/courses/6",
             "name":"Professional Experience 3 (Mathematics/Science)",
             "duration":5.0,
             "description":"The course will talk in depth about: Professional Experience 3 (Mathematics/Science)",
             "tutor":{  
                "id":2,
                "email":"TA@mymail.com",
                "userName":"T",
                "firstName":"T",
                "lastName":"A",
                "gender":0
             },
             "subject":{  
                "id":2,
                "name":"Science"
             }
          },
          {  
             "id":7,
             "url":"http://localhost:8001/api/courses/7",
             "name":"Geography Teaching Methods 1",
             "duration":5.0,
             "description":"The course will talk in depth about: Geography Teaching Methods 1",
             "tutor":{  
                "id":3,
                "email":"TW@mymail.com",
                "userName":"Ti",
                "firstName":"T",
                "lastName":"W",
                "gender":0
             },
             "subject":{  
                "id":3,
                "name":"Geography"
             }
          },
          {  
             "id":8,
             "url":"http://localhost:8001/api/courses/8",
             "name":"Geography Teaching Methods 2",
             "duration":5.0,
             "description":"The course will talk in depth about: Geography Teaching Methods 2",
             "tutor":{  
                "id":3,
                "email":"p@mymail.com",
                "userName":"f",
                "firstName":"f",
                "lastName":"f",
                "gender":0
             },
             "subject":{  
                "id":3,
                "name":"Geography"
             }
          },
          {  
             "id":9,
             "url":"http://localhost:8001/api/courses/9",
             "name":"Geography Teaching Methods 3",
             "duration":5.0,
             "description":"The course will talk in depth about: Geography Teaching Methods 3",
             "tutor":{  
                "id":3,
                "email":"s.s@mymail.com",
                "userName":"s",
                "firstName":"s",
                "lastName":"s",
                "gender":0
             },
             "subject":{  
                "id":3,
                "name":"Geography"
             }
          },
          {  
             "id":10,
             "url":"http://localhost:8001/api/courses/10",
             "name":"English Education 1",
             "duration":5.0,
             "description":"The course will talk in depth about: English Education 1",
             "tutor":{  
                "id":4,
                "email":"g.g@outlook.com",
                "userName":"g",
                "firstName":"g",
                "lastName":"g",
                "gender":0
             },
             "subject":{  
                "id":4,
                "name":"English"
             }
          }
       ]
    }

2 个答案:

答案 0 :(得分:3)

您的JSON代表CourseModel的单个实例。您应该将其反序列化为CourseModel的单个实例,而不是其中的列表。

这应该有用。

var data = JsonConvert.DeserializeObject<CourseModel>(responseData);

答案 1 :(得分:0)

我相信您已正确设置了TutorSubject错误,因为您尝试将单个对象反序列化为List<T>

DO:

 var data = JsonConvert.DeserializeObject<CourseModel>(responseData);

另外,要创建相关模型,您可以将JSON粘贴到http://json2csharp.com/并获取生成的模型,如下所示:

public class Tutor
{
    public int id { get; set; }
    public string email { get; set; }
    public string userName { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
    public int gender { get; set; }
}

public class Subject
{
    public int id { get; set; }
    public string name { get; set; }
}

public class CourseModel
{
    public int id { get; set; }
    public string url { get; set; }
    public string name { get; set; }
    public string duration { get; set; }
    public string description { get; set; }
    public Tutor tutor { get; set; }
    public Subject subject { get; set; }
}