如何通过子节点Pdf值获取JSON中父节点IssueId(Json.Net实现)
实现通过PDF编号查找所属Issue的IssueId
下面提供几种适配你现有代码结构的解决方案:
方法1:基础遍历查找(无需修改类结构)
直接遍历已反序列化的List<Issue>,逐个检查每个Issue下的文章是否匹配目标PDF编号:
int targetPdf = 3789306; int? matchedIssueId = null; foreach (var issue in issues) { var targetArticle = issue.Articles.FirstOrDefault(article => article.Pdf == targetPdf); if (targetArticle != null) { matchedIssueId = issue.IssueId; break; } } // 使用结果 if (matchedIssueId.HasValue) { Console.WriteLine($"匹配的IssueId:{matchedIssueId.Value}"); } else { Console.WriteLine("未找到对应PDF编号的文章"); }
方法2:LINQ简化写法
用LINQ链式调用实现更简洁的查找逻辑:
int targetPdf = 3789306; int? matchedIssueId = issues .FirstOrDefault(issue => issue.Articles.Any(article => article.Pdf == targetPdf)) ?.IssueId; // 输出结果 Console.WriteLine(matchedIssueId.HasValue ? $"匹配的IssueId:{matchedIssueId.Value}" : "无匹配项");
方法3:添加父引用(适合频繁查询场景)
如果需要多次根据文章查找所属Issue,可修改类结构添加父引用,提升后续查询效率:
public class Issue { public int Order { get; set; } public int IssueId { get; set; } public string Journal { get; set; } public string Identity { get; set; } public string Web { get; set; } public List<Article> Articles { get; set; } = new List<Article>(); // 反序列化后初始化父引用 [JsonIgnore] public void SetArticleParentReferences() { foreach (var article in Articles) { article.ParentIssue = this; } } } public class Article { public string Link { get; set; } public int Pdf { get; set; } [JsonIgnore] // 避免序列化该属性 public Issue ParentIssue { get; set; } }
反序列化后初始化引用,后续查询直接通过文章对象获取IssueId:
var issues = JsonConvert.DeserializeObject<List<Issue>>(jsonString); foreach (var issue in issues) { issue.SetArticleParentReferences(); } // 查找目标文章并获取IssueId int targetPdf = 3789306; var targetArticle = issues.SelectMany(issue => issue.Articles) .FirstOrDefault(article => article.Pdf == targetPdf); if (targetArticle != null) { Console.WriteLine($"匹配的IssueId:{targetArticle.ParentIssue.IssueId}"); }
内容的提问来源于stack exchange,提问作者Sarper Sözen
相关产品推荐
相关产品推荐

