从字符串中获取密钥

Fetch key from String

下面是目前实现的获取所有teacherID并存入列表的方法

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;
}

我遇到异常是因为在第一个列表中不存在 teacherId。 任何人都可以帮助我解决这个问题。

添加前使用空检查。如果键不存在则返回 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();