我从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
答案 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 project,taught 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);
}