我正在从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);
}