2012-10-16 65 views
1

在我的項目中,我必須加載一些json文件。我分析他們JSONKit與將對象添加到由JSONKit創建的字典中?

NSMutableDictionary *json = [myJSON objectFromJSONString]; 

每一個分析後,我將它們添加到一個數組,如:

[self.themeArray addObject:json]; 

能正常工作至今。現在我需要通過視圖之間的字典。工作到目前爲止,但我需要添加更多的對象到字典對象 - > JSON。即使它,我宣佈json作爲NSMutableDictionary,它不允許我添加對象,因爲它似乎JSONKit分析器創建非可變字典。

我在想創建一個包含json字典和我的附加數據的對象,所以我不必更改json字典。我甚至可以將它改爲NSDictionary,因爲不需要改變它。但是這對我來說似乎並不高雅。

您是否知道如何在不更改JSONKit庫的情況下解決此問題?

在此先感謝!

編輯

我只是改變了我的代碼

NSMutableDictionary *json = [[myJSON objectFromJSONString] mutableCopy]; 

像這樣

[[self.theme objectForKey:@"theme"] setObject:sender forKey:@"sender"]; 
[[self.theme objectForKey:@"theme"] setValue:sender forKey:@"sender"]; 

的Xcode後試圖拋出一個異常:

*終止應用程序由於Ť o未捕獲異常'NSInternalInconsistencyException',原因:'* - [JKDictionary setObject:forKey:]:發送給不可變對象的變異方法'

我認爲這是由於上級字典中仍存在嵌套字典。然後,我將不得不通過我的json對象來將所有字典複製到可變字典中,對嗎?

也許最好切換到Guillaume建議的NSJSONSerialization。

編輯

我只是想這樣的事情

[self.theme setValue:sender forKey:@"sender"]; 

和它的作品吧!這是我所承擔的。只有json對象被複制到一個可變對象。對你來說可能很明顯,這不是我。

謝謝大家的幫助!

編輯

最後我改變了我的代碼後,我又不能設法改變內心深處,我的字典數據對可變對象的所有對象。我拋出了JSONKit,現在使用NSJSONDeserialization作爲推薦,這裏帶有選項NSJSONReadingMutableContainers。我的代碼現在看起來像這樣,所有的容器(數組和字典)也可以在內部進行深入修改。這讓我高興! ;-)

NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:myJSON options:NSJSONReadingMutableContainers error:&jsonParsingError]; 
+1

這也不是辦法,因爲要使用JSONKit,但如果你使用蘋果的NSJSONSerialization代替(iOS 5以上),有一個選項來獲得可變對象。否則,'mutableCopy'是要走的路。 – Guillaume

回答

2

你總是可以通過複製他們從非可變同行對象的可變版本。

NSMutableDictionary* json = [[myJSON objectFromJSONString] mutableCopy]; 

這不是最優的,但從性能的角度來看,複製較小的字典通常不會引起注意。

+1

簡寫爲[[myJSON objectFromJSONString] mutableCopy];不知道,但可能會稍微快一點 – Tjirp

+0

當然。忘記那個:) – Krumelur

1

即使它我把json聲明爲NSMutableDictionary,它不允許我添加對象,因爲它似乎是JSONKit解析器創建非可變字典。

什麼類型的變量在聲明意味着什麼。您可能已宣佈jsonNSNumber,這不會使其成爲NSNumber

您需要製作字典的可變副本(使用mutableCopy)才能獲得NSMutableDictionary

1

我有三個想法給你。

  1. 創建真實的數據模型對象並將它們存儲在您的數組中。使用JSON字典來初始化您的對象。
  2. 將NSMutableDictionary對象存儲在您的數組中。將JSON字典傳遞到+[NSMutableDictionary dictionaryWithDictionary:]以啓動NSMutableDictionary。其他人建議在JSON字典上調用-[NSDictionary mutableCopy]來做同樣的事情。
  3. 根據存儲附加數據的NSDictionary創建一個類別。

注:

一般創建類來表示你的數據被認爲是最好的選擇,但它也是前面工作的最大量。基本上,當您嘗試維護字典時,您需要更多的前期工作來應對更多的維護工作。

存儲可變字典正是你似乎要求的,但它可能有很多工作來找到所有的地方,JSON字典添加到數組中,並用新的調用替換它們。

創建的NSDictionary類別意味着你不應該需要改變任何當前的代碼,但它需要維護,瞭解你是如何增強的NSDictionary。另外,它將有助於將您的更改與原始解析的JSON分開。您可以使用關聯的對象來存儲數據。

+0

這是一個很好的建議。非常感謝你! – rockstarberlin