从字符串中提取密钥



以下是当前实现的获取所有教师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();

相关内容

  • 没有找到相关文章

最新更新