Linq-to-JSON的SelectToken方法混淆和替代

本文关键字:SelectToken 方法 Linq-to-JSON | 更新日期: 2023-09-27 18:15:22

我希望我能在不提供代码示例的情况下问这个问题,因为它更多的是关于缺少文档和潜在的替代方法/命令。

在我现有的Linq-to-JSON代码中,我有以下代码片段:

var firstOrDefault = parent.AncestorsAndSelf()
    .Select(p => p.SelectToken("COMPANY"))         
    .FirstOrDefault(k => k != null);          

这段代码位于一个更大的Linq查询中,该查询遍历从根JSON对象派生的所有JArray和所有JObject对象。

我的问题与p.SelectToken("COMPANY")有关。这似乎正在做的是查看父JSON的祖先树,并抓取它以"COMPANY"的名称看到的第一个或默认令牌的值。这正是我需要它做的。但是我现在有两个额外的要求:

  1. 我知道任何带有"COMPANY"名称的令牌总是会映射到一个字符串值。我需要抓取与COMPANY一起的兄弟字符串值JProperty对象。
因此,我可能有一个JSON片段看起来像这样:
{
  "COMPANY":"Microsoft",
  "LOCATION":"Seattle",
  "PHONE":"800-555-1212"
  "METADATA" :
  {
     "AA":"AA",
     "BB":"BB"
  }
}

在本例中,我希望使用p.SelectToken查找包含"COMPANY"条目的第一个祖先令牌——但是随后我需要构建一个包含所有兄弟JProperty值的List,以便该List包含以下JProperty元素:

  "COMPANY":"Microsoft"
  "LOCATION":"Seattle"
  "PHONE":"800-555-1212"

回到p. selecttoken在lambda表达式中的选择。我对Linq和各种JSON了解不够。. NET方法知道除了SelectToken之外使用哪个方法,以便选择与所选令牌位于同一对象中的所有兄弟属性。我尝试使用.Where(jt => (jt.Type == JTokenType.JProperty)的λ,然后使用.Select(p => p.Name == "COMPANY")的λ,但这总是产生0的结果。我只是迷路了。我能想到的唯一一件事是,也许解决方案需要的不仅仅是对lambda表达式的更新,比如一个带有额外变量的完整函数,等等。

另外,我在JSON中找不到任何好的文档。. NET中的SelectToken。我只看到一个简单的例子和一个关于它的作用的句子。如果有学习此类JSON的其他资源。. NET Linq方法,请分享。

Linq-to-JSON的SelectToken方法混淆和替代

我相信这应该可以满足您的要求:

    var firstOrDefault = parent
        // Walk up the hierarchy
        .AncestorsAndSelf()
        // Find an object of type JObject
        .OfType<JObject>()
        // That has a COMPANY property
        .Where(o => o["COMPANY"] != null)
        // Make a new JObject with the string properties of that JObject
        .Select(o => new JObject(o.Properties().Where(p => p.Value.Type == JTokenType.String)))
        // And return the first (lowest) one.
        .FirstOrDefault();