1

我从 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。因此,发布的代码按预期工作,我更新了我的代码也更简单。对不起这里的噪音。橡皮鸭问题解决的完美例证

4

2 回答 2

4

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

在把我的头撞在墙上几个小时并写了这篇文章之后,我发现了发生了什么。上面的代码是我实际代码的简化版本。实际上,答案就是这种简化。原始代码稍微缩写了一点:

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

关键是我打错了ToObject<JArray>()。这remove()很可能破坏了逻辑,因为新对象与原始对象不同JArray。因此,发布的代码按预期工作,我更新了我的代码也更简单。对不起这里的噪音。橡皮鸭问题解决的完美例证 感谢 James NK 的快速响应(在 Twitter 上)和他的优秀库。就像杰夫阿特伍德我们的那样,不止一次地通过捐赠来感谢他。

于 2013-01-24T17:53:49.033 回答
1

您可以使用此函数从 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);
}
于 2018-02-11T18:05:21.667 回答