【问题标题】:Linq-to-JSON SelectToken Method Confusion and AlternativesLinq-to-JSON SelectToken 方法混淆和替代方案
【发布时间】:2016-10-28 17:47:06
【问题描述】:

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

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

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 对象。

因此,我可能有一个如下所示的 JSON sn-p:

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

在本例中,我想使用p.SelectToken 来查找包含“COMPANY”条目的第一个祖先标记——但随后我需要构建一个包含所有同级 JProperty 值的列表,以便列表包含这些JProperty 元素:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 总是非常感谢您的专业知识。我会试一试,很快就会更新。非常感谢。
    • 就像奥运滑冰运动员一样,你让它看起来太容易了。现在我看到了 o["COMPANY"] 如此明显。完美,感谢您在没有完整程序示例的情况下解决问题。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多