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

时间:2016-10-28 17:47:07

标签: c# json.net linq-to-json

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

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

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

此代码位于更大的Linq查询中,该查询遍历所有JArray和从根JSON对象下降的所有JObject对象。

我的问题与p.SelectToken("COMPANY")有关。这看起来正在做的是查看父JSON的祖先树,并抓住它看到的名为“COMPANY”的第一个或默认令牌的VALUE。这正是我需要它做的事情。但我现在有两个额外的要求:

  1. 我知道任何名为“COMPANY”的令牌都会映射到字符串值。
  2. 我需要抓住伴随COMPANY的兄弟字符串值JProperty对象。
  3. 因此,我可能有一个如下所示的JSON片段:

    {
      "COMPANY":"Microsoft",
      "LOCATION":"Seattle",
      "PHONE":"800-555-1212"
      "METADATA" :
      {
         "AA":"AA",
         "BB":"BB"
      }
    }
    

    在这个例子中,我想使用p.SelectToken来查找包含“COMPANY”条目的第一个祖先令牌 - 但是我需要构建一个包含所有兄弟JProperty值的List,以便列表包含这些JProperty元素:

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

    返回选择的lambda表达式中的p.SelectToken。我不太了解Linq或各种JSON.NET方法,以了解除SelectToken之外使用哪种方法,以便选择与所选标记位于同一对象中的所有同级属性。我尝试使用lambda为.Where的{​​{1}},然后使用lambda为(jt => (jt.Type == JTokenType.JProperty)的{​​{1}},但这总是产生0结果。我迷失了。我唯一能想到的是,解决方案可能需要的不仅仅是对lambda表达式的更新,例如带有附加变量的完整函数等。

    另外,我在JSON.NET上找不到任何关于SelectToken的好文档。我只看到一个简单的例子和​​一个关于它的作用的句子。如果有其他资源可以了解这些JSON.NET Linq方法,请分享。

1 个答案:

答案 0 :(得分:2)

我相信这应该符合您的要求:

    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();