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

时间:2013-01-24 02:57:27

标签: c# json.net

我从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

我可以使用以下命令从secret对象中删除root属性:

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不同。 所以,发布的代码按预期工作,我更新了代码也更简单了。对不起这里的噪音。 Rubber Duck Problem Solving

的完美例证

2 个答案:

答案 0 :(得分:3)

为了清楚起见,

重新发布在这里:

将我的头撞在墙上几个小时并写完这篇文章之后,我发现了发生的事情。上面的代码是我实际代码的简化版本。实际上,这就是简化。原始代码有点缩写

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

关键是我错误地打电话给ToObject<JArray>()。这最有可能破坏了remove()逻辑,因为新对象与原始JArray不同。所以,发布的代码按预期工作,我更新了代码也更简单了。对不起这里的噪音。 Rubber Duck Problem Solving的完美例证 感谢James N-K的快速反应(在Twitter上)和他的大图书馆。感谢他,就像杰夫阿特伍德his projecttaught us一样more than once。{/ p>

答案 1 :(得分:0)

您可以使用此函数从JArray中删除任何obj(或string / int / boolean)...

此功能有两个参数:
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);
}