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 に答える