为什么我不能从 JArray 中删除元素



我正在从HTTP流中获取一个json对象。我使用以下方法创建一个JObject

var stream = await client.GetStreamAsync(uri);
var root = JToken.Load(new JsonTextReader(new StreamReader(stream)));

这给了我正确的回应。但是现在,我想删除其 results 属性的最后一个元素,即数组 ( JArray )。我使用此代码:

var results = (JArray)root["results"];
var last = results.Last();              // gets the last element -- correct
var removed = results.Remove(last);     // removed = false and last not removed
var another = last.Remove();            // doesn't work either

我能够使用以下方法从root对象本身中删除secret属性:

var removed = ((JObject)root).Remove("secret"); // removed = true, works

我还可以将元素添加到results数组中,但由于某种原因,我无法删除它们。我错过了什么?

编辑:在把我的头撞在墙上几个小时并写下这篇文章后,我发现了发生了什么。上面的代码是我实际代码的简化版本。实际上,简化才是答案。原始代码更简短一些:

var last = root["results"].ToObject<JArray>().Last();
last.Remove();                                         // did not work

关键是我被错误地称为ToObject<JArray>().这很可能破坏了remove()逻辑,因为新对象与原始JArray不同。因此,发布的代码按预期工作,并且我也更新了我的代码,使其更简单。对不起,这里的噪音。解决橡皮鸭问题的完美例证

清楚起见,请在此处重新发布:

在用头撞墙几个小时并写下这篇文章后,我发现了发生了什么。上面的代码是我实际代码的简化版本。实际上,简化才是答案。原始代码更简短一些:

var last = root["results"].ToObject<JArray>().Last();
last.Remove();                                         // did not work

关键是我错误地称ToObject<JArray>().这很可能破坏了remove()逻辑,因为新对象与原始对象不同JArray。因此,发布的代码按预期工作,并且我也更新了我的代码,使其更简单。对不起,这里的噪音。解决橡皮鸭问题的完美例证感谢James N-K的快速回复(在Twitter上)和他伟大的图书馆。感谢他,像杰夫·阿特伍德(Jeff Atwood)教给我们的那样,不止一次地为他的项目捐款。

您可以使用此函数从 JArray 中删除任何 obj(或字符串/int/布尔值)。

此函数采用两个参数:
1)要从中删除任何内容的 JArray。
2)要从JArray中删除的动态(JObject或字符串或整数或布尔值)变量。

此函数将返回更新的 JArray。

private static JArray RemoveValue(JArray oldArray, dynamic obj)
{
    List<string> newArray= oldArray.ToObject<List<string>>();
    newArray.Remove(obj); 
    return JArray.FromObject(newArray);
}

相关内容

  • 没有找到相关文章

最新更新