【问题标题】:Deserialize json with data property to a list of objects to what is inside the json array将带有数据属性的 json 反序列化为 json 数组中的对象列表
【发布时间】:2021-05-03 18:28:53
【问题描述】:

我尝试将其取消实现以仅将数据属性返回给 javascript。

我的控制器类将 json 返回到 javascript:

public ActionResult<IEnumerable> GetCourseThemes(string courseThemesId)
        {
            try
            {
                string jsonResult = _courseService.GetCourseThemes(courseThemesId);

                var ResultObj = JsonConvert.DeserializeObject<List<CourseTheme>>(jsonResult);

                return Ok(ResultObj);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message.ToString());
            }
        }

返回 API 使用的 GetCourseThemes 方法的字符串 json

{
  "data": [
    {
      "courseThemeId": 3,
      "key": "ESEP",
      "name": "Scrum",
      "registrationDate": "2021-01-29T09:44:05.04",
      "status": true
    }
  ]
}

错误信息:

无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[Sygno.SE.UI.Core.Entities.CourseTheme]',因为类型需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。 要修复此错误,要么将 JSON 更改为 JSON 数组(例如 [1,2,3]),要么将反序列化类型更改为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型可以从 JSON 对象反序列化的数组或列表。 JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。 路径“数据”,第 1 行,位置 8。 [1]:https://i.stack.imgur.com/VnH6l.png

【问题讨论】:

    标签: javascript json asp.net-core asp.net-web-api .net-5


    【解决方案1】:

    您可以尝试将jsonResult反序列化为JObject,并将mydata["data"].ToString()反序列化为List&lt;CourseTheme&gt;

    public ActionResult<IEnumerable> GetCourseThemes(string courseThemesId)
            {
                try
                {
                    string jsonResult = _courseService.GetCourseThemes(courseThemesId);
    
                    var mydata = JsonConvert.DeserializeObject<JObject>(jsonResult);
                    var ResultObj = JsonConvert.DeserializeObject<List<CourseTheme>>(mydata["data"].ToString());
    
                    return Ok(ResultObj);
                }
                catch (Exception ex)
                {
                    return BadRequest(ex.Message.ToString());
                }
            }
    

    结果:

    【讨论】:

      【解决方案2】:

      您的 JSON 对象是具有单个键(“数据”)的字典,而不是数组。该键下的字典条目的内容就是您要查找的列表。

      将 JSON 对象反序列化为字典(而不是列表),然后通过其名为“data”的属性访问该列表将为您获取列表。

      如果您可以修改 _courseService,您还可以更改 JSON 对象的格式,以列表而不是字典的形式返回。用单个键将其包装在字典中似乎毫无意义,除非它旨在成为可扩展或多用途对象。

      【讨论】:

        【解决方案3】:

        这是解决问题的一种方法:

        using Newtonsoft.Json.Linq;
        ....
        
        var jsonResult = _courseService.GetCourseThemes(courseThemesId);
        var jsonObject= JObject.Parse(jsonResult );
        var list = jsonObject["data"].ToObjectList<CourseTheme>>();
        // or var list =  JsonConvert.DeserializeObject<List<CourseTheme>>(jsonObject["data"].ToString());
        return Ok(list );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多