以下是当前实现的获取所有教师ID并存储在列表中的方法
public async Task<List<string>> GetId(string id)
{
var teacherID= new List<string>();
var responseMessage = @"[
{ 'id': '100','studentId': '001','studentName': 'TestStudent1'},
{'id': '101','studentId': '002','teacherId': '100','studentName': 'TestStudent2'},
{'id': '102','studentId': '003','teacherId': '101','studentName': 'TestStudent3'}]";
var jsonObj = JsonConvert.DeserializeObject<List<JObject>>(responseMessage);
foreach (var id in jsonObj)
{
var Id = id["teacherId"];
teacherID.Add(Id.ToString());
}
return teacherID;
}
我遇到了异常,因为第一个列表中的教师ID不存在。有人能帮我解决这个问题吗。
添加前使用null检查。若键不存在,则返回null。
foreach (var tid in jsonObj)
{
var Id = tid["teacherId"];
if(null!=Id)
{
teacherID.Add(Id.ToString());
}
}
此外,foreach中的方法参数和变量具有相同的名称";id";。这是行不通的。我已经在foreach循环中更改了这个。
您可以使用TryGetValue
foreach (var obj in jsonObj)
{
if (obj.TryGetValue("teacherId", StringComparison.CurrentCultureIgnoreCase, out var teacherId))
{
teacherIds.Add(((string)teacherId));
}
}
或者空检查:
foreach (var obj in jsonObj)
{
if(obj["teacherId"] != null)
{
teacherIds.Add(obj["teacherId"].ToString());
}
}
然而,既然你似乎有一个结构良好的响应,为什么不做一个强类型的去激励:
class MyViewModel {
public string Id { get; set; }
public string StudentId { get; set; }
public string TeacherId { get; set; }
public string StudentName { get; set; }
}
var responseMessage = @"[
{ 'id': '100','studentId': '001','studentName': 'TestStudent1'},
{'id': '101','studentId': '002','teacherId': '100','studentName': 'TestStudent2'},
{'id': '102','studentId': '003','teacherId': '101','studentName': 'TestStudent3'}]";
var response = JsonConvert.DeserializeObject<List<MyViewModel>>(responseMessage);
var teacherIds = response.Where(x => !string.IsNullOrEmpty(x.TeacherId))
.Select(x => x.TeacherId)
.ToList();