我想这是我的一系列问题中的另一个条目,但我再次陷入困境。这次,我在使用 JObjects 的 JArray 并确定 JArray 中每个元素的 Property.Value 类型时遇到了麻烦...
我的代码在这里:https://dotnetfiddle.net/bRcSAQ
我之前的问题和这个问题之间的区别在于我的外部 Linq 查询同时获取 JObject 和 JArray 令牌,所以这就是为什么我有一个if (jo is JObject)
在第 40 行和if (jo is JArray)
在48号线。
一旦我知道我有一个 JArray<JObjects>
,我的代码如下所示(第 48 行-):
if (jo is JArray)
{
var items = jo.Children<JObject>();
// return a JObject object
}
当我使用调试器并查看项目时,我发现它包含 3 个 JObject 对象 - 一个用于 Item_3A1、Item_3A2 和 Item3A3。但我需要知道每个 JProperty.Value 的 JTokenType,因为我只对 JTokenType.String 类型的属性值感兴趣。
所以我尝试:
// doesn't work :(
var items = jo.Children<JObject>()
.Where(p => p.Value.Type == JTokenType.String);
编译器用错误标记了 Value 属性CS0119 'JToken.Value<T>(object)' is a method, which is not valid in the given context.
我意识到 Linq Express 中的“p”不是 JProperty。我猜它是一个 JObject。而且我不知道如何转换“p”,以便我可以检查它代表的 JProperty 对象的类型。
最终,我需要用于 JArray 处理的代码(从第 48 行开始)来添加返回一个 JObject,该 JObject 包含仅由 JTokenType.String 类型的 JProperty 对象组成的 JSON 数组。这意味着给定示例 JSON,它首先应该返回一个包含以下 JSON 属性的 JObject:
{ ""Item_3A1"": ""Desc_3A1"" },
{ ""Item_3A2"": ""Desc_3A2"" },
{ ""Item_3A3"": ""Desc_3A3"" }
在下一次迭代中,它应该返回一个包含这些 JSON 属性的 JObject(请注意,嵌套的 Array3B1 属性被省略,因为 Array3B1 不是值类型为 JTokenType.String 的 JProperty):
{ ""Item_3B1"": ""Desc_3B1"" },
{ ""Item_3B2"": ""Desc_3B2"" },
第三次迭代将包含:
{ ""Item_3B11"": ""Desc_3B11"" },
{ ""Item_3B12"": ""Desc_3B12"" },
{ ""Item_3B13"": ""Desc_3B13"" }
第四次(最后一次)迭代将包含:
{ ""Item_3C1"": ""Desc_3C1"" },
{ ""Item_3C2"": ""Desc_3C2"" },
{ ""Item_3C3"": ""Desc_3C3"" }
这可能是我在这个“系列”中的最后一个障碍。
衷心感谢任何能够并且愿意提供帮助的人,并再次特别感谢用户“Brian Rogers”和“dbc”,感谢他们真正令人惊叹的 JSON.NET/Linq 知识。