我希望我可以在不提供代码示例的情况下提出这个问题,因为它更多的是缺少文档和潜在的替代方法/命令。
在我现有的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。这正是我需要它做的事情。但我现在有两个额外的要求:
因此,我可能有一个如下所示的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方法,请分享。
答案 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();