从字符串中获取密钥
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();
下面是目前实现的获取所有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();