【问题标题】:c# JSONConvert.DeserializeObject<List<RootObject>> returns nullsc# JSONConvert.DeserializeObject<List<RootObject>> 返回空值
【发布时间】:2017-03-18 04:25:38
【问题描述】:

我正在尝试将 HTTPWebRequest 响应 (Json) 反序列化为 c# 对象/类,但遇到了麻烦。返回一个包含 10 个对象实例的集合,并且所有对象都为空。

这是json:

[
{
"id":2227,
"user_id":441,
"grades":
    {"html_url":"https://...",
    "current_score":91.26,
    "current_grade":null,
    },
"sis_account_id":"11",
"user":
    {"id":441,
     "name":"Nicholas Bailey",
    }
},

以下是课程:

    public class Grade
{
    public string html_url { get; set; }
    public decimal current_score { get; set; }
    public string current_grade { get; set; }
}
public class User
{
    public int id { get; set; }
    public string name { get; set; }
}
public class Enrollment
{
    public int id { get; set; }
    public int user_id { get; set; }
    public Grade grades { get; set; }
    public string sis_account_id { get; set; }
    public User user { get; set; }
}
public class RootObject
{
    public Enrollment enrollment { get; set; }
}

这是我的代码:

  HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://(some uri)");

        WebResponse response = request.GetResponse();

        StreamReader sr = new StreamReader(response.GetResponseStream());

        string content = sr.ReadToEnd();

        JsonSerializerSettings settings = new JsonSerializerSettings();
        settings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore;

        var outObject = JsonConvert.DeserializeObject<List<RootObject>>(content, settings);

我在 google 上查看了很多代码,但没有找到与我的情况接近的情况。另外,我对通用集合有点绿色。代码运行良好,但在调试器中“outObject”包含 10 个条目,每个条目都有一个为空的“Enrollment”对象。

我也尝试过使用具有 10 多个条目的 json 进行此操作,但它仍然会出现 10 个。但我现在更关注空值(一次一件事!)。为简洁起见,我删除了 json 中的几个条目,但主要模式(一个包含成绩对象和嵌入其中的用户对象的注册对象)仍然存在。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 您是否为所有类添加了“Serializable”属性?
  • @AkshayMahajan Json.NET 不依赖于 Serializable 属性。 Serializable 影响二进制序列化。
  • 为了好玩,只需序列化为动态并删除 DTO

标签: c# json.net generic-collections


【解决方案1】:

反序列化为List&lt;Enrollment&gt; 而不是List&lt;RootObject&gt;

var enrollment = JsonConvert.DeserializeObject<List<Enrollment>>(content, settings);

根数组中的第一个 JSON 对象具有与Enrollment 的成员对应的属性"id""user_id" 等。相反,在任何地方的 JSON 中都没有属性 "enrollment"

示例fiddle

更新

你问过,我试过这个,现在我得到一个异常“将值 {null} 转换为类型'System.Int32'时出错。路径'[0].associated_user_id',第 1 行,位置 165。 "为简洁起见,已删除 associated_user_id,但我会将其添加回我的代码中。有什么想法吗?

在您的数据模型的某个地方,您必须具有以下成员(字段或属性):

public int associated_user_id;

将其更改为可为空的:

public int? associated_user_id;

【讨论】:

  • 谢谢,解决了!知道为什么调试器只列出 10 个对象,而不是 13 个(这是总数)吗?
  • @PeteHesse - 抱歉,我没有想到。您可能想ask another question。如果这个问题有答案,请mark it as such
猜你喜欢
  • 2021-12-21
  • 2018-02-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
相关资源
最近更新 更多