gpt4 book ai didi

c# - JSON.NET - 选择所有对象

转载 作者:太空狗 更新时间:2023-10-29 22:35:50 25 4
gpt4 key购买 nike

我正在寻找一种使用 Json.NET 选择 JObject 中所有对象的方法。所以简而言之,如果我有以下 JSON:

{
"someCar" : {
"id" : "3",
"model" : "M7",
"engine" : "FI V8",
},
"name" : "carparkone",
"id" : "1",
"cars" : [
{
"id" : "1",
"model" : "s60",
"engine" : "i5",
},
{
"id" : "2",
"model" : "m3",
"engine" : "FI V6",
},
{
"id" : "3",
"model" : "M7",
"engine" : "FI V8",
}
]
}

我会运行一些命令来获取其中所有对象的数组,即 {} block 中的任何内容。

理想情况下,我会找到 someProp 具有 some value 的所有对象,因此只有具有属性 engine 且值为V6

tl;dr 问题:

  1. 如何获取嵌套在 JObject 中的所有对象的列表?
  2. (奖励)仅获取具有特定属性的对象。

最佳答案

您可以使用 LINQ to JSON在没有预定义模式时解析和过滤 JSON 对象。

首先,将您的 JSON 解析为 JObject 使用 JToken.Parse() .然后你可以使用 JContainer.DescendantsAndSelf() 按文档顺序遍历该根对象及其所有后代标记。 (或者使用 JContainer.Descendants() 如果你想跳过根对象。)然后你可以过滤然后使用 .OfType<JObject>() 返回所有对象,无论是否嵌套:

var root = JObject.Parse(jsonString;
var allObjs = root.DescendantsAndSelf()
.OfType<JObject>()
.ToArray();

要按某个值过滤,您可以添加额外的 Where() 子句如以下扩展方法所示:

public static partial class JTokenExtensions
{
public static JObject [] FilterObjects<T>(this JObject root, string someProp, T someValue)
{
var comparer = new JTokenEqualityComparer();
var someValueToken = JToken.FromObject(someValue);
var objs = root.DescendantsAndSelf()
.OfType<JObject>()
.Where(t => comparer.Equals(t[someProp], someValueToken))
.ToArray();

return objs;
}
}

然后做:

var filteredObjs = root.FilterObjects(someProp, someValue);

制作FilterObjects()完全通用,我将所需的值序列化为 JToken然后使用 JTokenEqualityComparer 将实际值与期望值进行比较。如果您知道所需的值是原始类型,您可以这样做:

public static partial class JTokenExtensions
{
public static bool IsNull(this JToken token)
{
return token == null || token.Type == JTokenType.Null;
}

public static JObject[] FilterObjectsSimple<T>(this JObject root, string someProp, T someValue)
{
var comparer = EqualityComparer<T>.Default;
var objs = root.DescendantsAndSelf()
.OfType<JObject>()
.Where(t => { var v = t[someProp]; return v != null && (someValue == null ? v.IsNull() : comparer.Equals(v.ToObject<T>(), someValue)); })
.ToArray();

return objs;
}
}

样本 fiddle .

注意 - 您也可以考虑使用 SelectTokens() , 它支持 JSONPath query syntax ,例如:

var someProp = "id";
var someValue = "3";
var filterString = string.Format(@"..*[?(@.{0} == '{1}')]", someProp, someValue);
var filteredObjs = root.SelectTokens(filterString).ToArray();

但是,您的 JSON 包含直接嵌套在其他对象中的对象,而 Newtonsoft 的 JSONPath 实现找不到此类直接嵌套的对象,如 JSONPath scripts not executing correctly for objects #1256 中所述。 .

关于c# - JSON.NET - 选择所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46611888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com