【问题标题】:Json object to Model MVC模型 MVC 的 Json 对象
【发布时间】:2016-07-28 18:16:03
【问题描述】:

这是我的 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 类型(例如,不是像整数这样的原始类型,也不是集合 可以从 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"
             }
          }
       ]
    }

【问题讨论】:

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


    【解决方案1】:

    我相信您已经正确设置了 TutorSubject错误是因为您试图将单个对象反序列化为 List&lt;T&gt;

    做:

     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; }
    }
    

    【讨论】:

      【解决方案2】:

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

      这应该可行。

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

      【讨论】:

      • 它确实适用于单个实例.. 但如果我将 url 更改为 string url = "localhost:8001/api/courses";并将其反序列化为列表我得到同样的错误..有什么想法吗?
      • 因为您的 json 数据是针对单个实例的,而不是它们的数组。
      • 如果我不使用参数,即 5 我得到不同的 Json 对象,我还需要显示另一个 Json 对象吗?
      • 因此,您需要根据是否在 REST API 调用中传递 Id(例如:5),有条件地反序列化为单个实例或列表。
      • 是的,完全正确。抱歉没有早点提到..我更新了问题
      猜你喜欢
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      相关资源
      最近更新 更多