c# JSONConvert.DeserializeObject<List<RootObject>> returns 空值
c# JSONConvert.DeserializeObject<List<RootObject>> returns nulls
我正在尝试将 HTTPWebRequest 响应 (Json) 反序列化为 c# object/class,但遇到了问题。返回一个包含 10 个对象实例的集合,所有对象都为 null。
这里是 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" 对象,该对象为空。
我也用 json 尝试过这个,它有超过 10 个条目,但它仍然有 10 个。但我现在更关注空值(一次一件事! ).为了简洁起见,我删除了 json 中的几个条目,但主要模式(一个带有成绩对象的注册对象和一个嵌入其中的用户对象)仍然存在。
如有任何帮助,我们将不胜感激。谢谢。
反序列化为 List<Enrollment>
而不是 List<RootObject>
:
var enrollment = JsonConvert.DeserializeObject<List<Enrollment>>(content, settings);
根数组中的第一个 JSON 对象具有对应于 Enrollment
成员的属性 "id"
、"user_id"
等。相反,JSON 中的任何地方都没有 属性 "enrollment"
。
示例 fiddle.
更新
你问了,我试过了,现在我遇到了一个异常 "Error converting value {null} to type 'System.Int32'. Path '[0].associated_user_id', line 1, position 165." associated_user_id 为简洁起见已被删除,但我会将其添加回我的代码中。有什么想法吗?
您的数据模型中的某处必须具有以下成员(字段或 属性):
public int associated_user_id;
将其更改为可为空:
public int? associated_user_id;
我正在尝试将 HTTPWebRequest 响应 (Json) 反序列化为 c# object/class,但遇到了问题。返回一个包含 10 个对象实例的集合,所有对象都为 null。
这里是 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" 对象,该对象为空。
我也用 json 尝试过这个,它有超过 10 个条目,但它仍然有 10 个。但我现在更关注空值(一次一件事! ).为了简洁起见,我删除了 json 中的几个条目,但主要模式(一个带有成绩对象的注册对象和一个嵌入其中的用户对象)仍然存在。
如有任何帮助,我们将不胜感激。谢谢。
反序列化为 List<Enrollment>
而不是 List<RootObject>
:
var enrollment = JsonConvert.DeserializeObject<List<Enrollment>>(content, settings);
根数组中的第一个 JSON 对象具有对应于 Enrollment
成员的属性 "id"
、"user_id"
等。相反,JSON 中的任何地方都没有 属性 "enrollment"
。
示例 fiddle.
更新
你问了,我试过了,现在我遇到了一个异常 "Error converting value {null} to type 'System.Int32'. Path '[0].associated_user_id', line 1, position 165." associated_user_id 为简洁起见已被删除,但我会将其添加回我的代码中。有什么想法吗?
您的数据模型中的某处必须具有以下成员(字段或 属性):
public int associated_user_id;
将其更改为可为空:
public int? associated_user_id;