gpt4 book ai didi

c# - 如何按值查找json token,然后删除token

转载 作者:太空宇宙 更新时间:2023-11-03 12:11:20 24 4
gpt4 key购买 nike

例如,我在 C# 中有一个像这样的 json:

{
"Harry.firstName": "Harry",
"Harry.lastName": "Birimirski",
"Harry.recordTitle": "My title",
"Harry.SomeRepeatable": [{
"GUID": "9dd8c7bb-64e1-452b-90d5-db2b6e505492",
"NestedRepetable": [{
"GUID": "05aa2161-fcc2-45a6-b0b7-8749d94a2e61",
"nestedText": "Nested first"
},
{
"GUID": "dfd67eeb-703b-4cc4-9321-b6a39084e687",
"nestedText": "Nested first 2"
}
],
"name": "First"
},
{
"GUID": "3318e544-1be8-4795-9bab-fa05de79cf46",
"NestedRepetable": [{
"GUID": "c1b60869-7c75-4af4-8037-be26aeca7939",
"nestedText": "Nested second"
}],
"name": "Second"
}
]
}

我想按值从 NestedRepetable 数组中删除项目。例如删除包含 GUID 的元素:05aa2161-fcc2-45a6-b0b7-8749d94a2e61,所需结果如下所示:

{
"Harry.firstName": "Harry",
"Harry.lastName": "Birimirski",
"Harry.recordTitle": "My title",
"Harry.SomeRepeatable": [{
"GUID": "9dd8c7bb-64e1-452b-90d5-db2b6e505492",
"NestedRepetable": [
{
"GUID": "dfd67eeb-703b-4cc4-9321-b6a39084e687",
"nestedText": "Nested first 2"
}
],
"name": "First"
},
{
"GUID": "3318e544-1be8-4795-9bab-fa05de79cf46",
"NestedRepetable": [{
"GUID": "c1b60869-7c75-4af4-8037-be26aeca7939",
"nestedText": "Nested second"
}],
"name": "Second"
}
]
}

我在 Json.NET 的帮助下尝试了几件事,但我做不到。请记住,整个 JSON 结构是动态的。我唯一知道的是本例中的字段名称 (GUID) 和字段中的值,应该将其删除。

我已尝试按照此 question 中描述的方式进行操作,但他们使用的是 json 的硬编码路径。那不是我的情况。

我使用了以下代码:

        private JToken RemoveFields(JToken token, string fieldValue)
{
JContainer container = token as JContainer;
if (container == null)
{
return token;
}

List<JToken> removeList = new List<JToken>();
foreach (JToken el in container.Children())
{
JProperty p = el as JProperty;
if (p != null)// && fields.Contains(p.Name))
{
if (p.Value.ToString() == fieldValue)
{
removeList.Add(el);

//try to remove the whole thing, not only GUID field ..
//removeList.Add(el.Parent);

}
}

RemoveFields(el, fieldValue);
}

foreach (JToken el in removeList)
{
el.Parent.Remove();
return token;
}

return token;
}

但我收到以下错误:

Collection was modified; enumeration operation may not execute"

可能是因为我正在尝试删除父元素。

最佳答案

您正在尝试查找并删除符合以下条件的对象:

  1. 名为 "NestedRepetable" 的数组属性包含的所有对象
  2. 有一个名为 "GUID" 的属性,具有特定值。

最简单的方法是使用 JToken.SelectTokens()JSONPath query :

var value = "05aa2161-fcc2-45a6-b0b7-8749d94a2e61";

var queryStringTemplate = "..NestedRepetable[?(@.GUID == '{0}')]";
var query = root.SelectTokens(string.Format(queryStringTemplate, value));

foreach (var obj in query.ToList())
obj.Remove();

如果您实际上并不关心对象是否嵌套在 "NestedRepetable" 中(您的问题在这一点上不清楚),您可以这样做

var queryStringTemplate = "..[?(@.GUID == '{0}')]";

注意事项:

  • ..递归下降 运算符。它降低了返回所有值的 JToken 层次结构。

  • NestedRepetable 匹配具有所需名称的属性值。

  • [?(@.GUID == '{0}')] 匹配属于 NestedRepetable 数组且属性名为 GUID 的对象 具有指定的值。

  • 删除与查询匹配的标记时,有必要通过调用 ToList() 来具体化查询,以避免您看到的 Collection was modified 异常.

  • 有关 JSONPath 语法的更多信息,请参阅 JSONPath - XPath for JSON .

示例工作 .Net fiddle here对于复杂查询和 here对于更简单的查询。

关于c# - 如何按值查找json token,然后删除token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52149657/

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