2013-01-24 149 views
-1

我從HTTP流獲取json對象。我創建一個JObject使用以下內容:爲什麼我不能從JArray中移除一個元素?

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>()。這很可能是因爲新對象與原始JArray不一樣而打破了remove()邏輯。 因此,發佈的代碼按預期工作,我更新了我的代碼也更簡單。對不起,這裏有噪音。 Rubber Duck Problem Solving

回答

3

重新張貼在這裏的一個完美例證爲清楚:

敲我的頭撞在牆上了幾個小時,寫這篇文章後,我發現了事情的原委。以上代碼是我的實際代碼的簡化版本。實際上這就是簡化。原始代碼是有點多簡稱

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

的關鍵是,我被錯誤地呼喚ToObject<JArray>()。這很可能是因爲新對象與原始JArray不一樣而打破了remove()邏輯。所以,發佈的代碼按預期工作,我更新了我的代碼也更簡單。對不起,這裏有噪音。 Rubber Duck Problem Solving 的完美插圖感謝James N-K對他的快速反應(在推特上)和他的偉大圖書館。感謝他給了his project,像傑夫阿特伍德taught us,more than once

+2

您應該在回答中添加更正的行而不是錯誤的行。儘管如此。 – Osama

+0

請在答案中有更新的代碼... – slayernoah

+0

認真@slayernoah?你能否停止追求名譽點並實際閱讀答案? *發佈的代碼按預期工作* –

0

您可以使用此功能從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); 
} 
+4

請解釋你的代碼,不要只是發佈代碼,並期望人們瞭解它。 – Persijn

+0

歡迎來到StackOverflow。只有代碼在他們的答案往往會被標記爲刪除,因爲他們是「低質量」。請閱讀關於回答問題的幫助部分,然後考慮在答案中添加一些評論。 – Graham

相關問題