2009-06-22 84 views
2

我正在使用json-framework來創建一個NSDictionary出JSON響應。這很奇妙。現在NSDictionary objectForKey返回值

,這JSON有效載荷中的一個或多個對象 - 我們姑且稱之爲X的排序是這樣的XML:

<OBJECTS> 
    <X> 
    ... 
    </x> 
    <X> 
    ... 
    </X> 
    <X> 
    ... 
    </X> 
</OBJECTS> 

當我看着在全部的X上述的NSDictionary對象,就像這樣:

NSDictionary *results = [[dict objectForKey:@"OBJECTS"] objectForKey:@"X"]; 

甚至:

NSDictionary *results = [dict valueForKeyPath:@"OBJECTS.X"]; 

我得到的,根據廣發行,一個NSCFArray NSDictionary對象。 (是的,我聞了一下這個事情太搞笑了這裏,但更多。)

當只有一個命名對象X,我回來一個誠實,善良的NSDictionary。

那麼......無論有多少個X,我應該怎麼做才能使其表現一貫?

乍一看,我認爲我只是將結果更改爲NSArray *,但是當我想快速枚舉結果時會發生什麼?現在我這樣做:

for (NSDictionary *result in results) 

在NSCFArray情況下(多XS),我回來了個人的NSDictionary每個X.在單X的情況下,我回到了一個的NSDictionary,除了現在我的觀點是一個層次太深。換句話說,而不是這個(人爲的例子):

(gdb) po results 
<NSCFArray 0xd4a940>(
{ 
    foo =  { 
     bar = "something"; 
    }; 
} 
{ 
    foo =  { 
     bar = "something else"; 
    }; 
} 
) 

我得到這個:

(gdb) po results 
{ 
    foo =  { 
     bar = "something"; 
    }; 
} 

線索歡迎/讚賞!你甚至可能會問,是否有必要將此分開,但現在讓我們假設這次旅行是非常必要的。 (不過,如果有人對此感到足夠強烈,我很樂意被說服)。

最終,在一天結束時,我想擁有一個NSArray的NSDictionary對象。

回答

1

我不熟悉JSON或json-framework,但很明顯objectForKey不能用於訪問X,因爲它們都具有相同的密鑰。

如果你知道objectForKey:@「對象」將返回一個NSDictionary(單件)或NSDictionarys的一個NSArray(多X元素),那麼你可以這樣做:

if (![results isKindOfClass:[NSArray class]]) { 
    results =[NSArray arrayWithObject:results]; 
} 

這會假設您完全理解json框架的行爲方式,可以獲得一致的結果。它會有些脆弱,如果元素返回的是一組條目而不是NSDitionary,那麼它將全部崩潰。

可能有一個json-framework的配置設置,可以讓你控制它在這種情況下的表現,這將是更可取的。

+0

啊,我沒有意識到objectForKey不能用來訪問同一個鍵的多個實例 - 謝謝! (雖然它似乎與NSCFArray完全相同......或者我正在幻覺......或者它只是未定義的行爲,我很幸運)。 我剛剛在本文中發生過,它處理多個X的,就像它一樣,接下來我會試試這個。如果它能正常工作,我會總結這個修復程序並回到這裏! http://iphonedevelopertips.com/cocoa/json-framework-for-iphone-part-2.html – 2009-06-22 13:24:33

+0

同時,這裏是我正在使用的成員函數。請注意,它返回一個字典或數組。除了任何庫mods,如果我可以測試字典,我可以根據需要將它分配給單對象數組。 http://json-framework.googlecode.com/svn/trunk/documentation/interfaceNSString_07NSString__SBJSON_08.html – 2009-06-22 13:41:54

+0

我錯了同一個鍵的多個實例。 (當然,我的意思是,如果這就是NSDictionary的工作原理,那麼它就是這樣工作的!)事實證明,我們確實有一系列字典,這正是你猜測的。 :) – 2009-06-23 11:59:19

0

這裏是我落得這樣做:

// Get the JSON response and return the result: 
NSString *jsonString = [NSString stringWithContentsOfURL:url]; 
NSDictionary *dict = [jsonString JSONValue]; 

// If OBJECTS.X gets a dictionary (one value), make an array of one. 
id myObject = [dict valueForKeyPath:@"OBJECTS.X"]; 
if ([myObject isKindOfClass:[NSDictionary class]]) { 
    results = [NSArray arrayWithObject:myObject]; 
} else { 
    results = myObject; 
} 

值得指出的是,JSONValue也可以返回字典數組。不過,我正在查看詞典分配後(OBJECTS.X)。

0

我不認爲你的兩個代碼示例,

NSDictionary *results = [[dict objectForKey:@"OBJECTS"] objectForKey:@"X"]; 

NSDictionary *results = [dict valueForKeyPath:@"OBJECTS.X"]; 

是等價的。 Key-Value-Coding有一些額外的智能與集合一起工作,這可能會把你扔到這裏。 (一個例子可以在Scott Stevenson的博客文章Theocacao: NSArray and KVC中找到。) 如果你恢復到前者,你可能會得到你期望的行爲。

2
NSDictionary *results = [[dict objectForKey:@"OBJECTS"] objectForKey:@"X"]; 

NSDictionary *results = [dict valueForKeyPath:@"OBJECTS.X"]; 

上述兩個是完全相同。第一種手術比第二種手術費用更高。

相關問題