2015-04-14 181 views
0

嗨我想創建一個PHP和iOS之間的鏈接,我正在使用JSON。雖然我的JSON數組很奇怪,但我不是創建者,因爲這是在一個封閉的API中,我無法改變它。Obj-C獲取JSON密鑰名稱

的JSON看起來像這樣:

{"success":true,"errors":[],"data":{"Servers":{"6":"Name here"}}} 

6是服務器的ID,而另一個是名稱。

正如你所看到的關鍵是ID和值是名稱,但我如何在Objective-C中獲得ID?我知道如何接收服務器名稱,但要做到這一點,我需要找到服務器ID。

這裏是我當前的代碼:

NSDictionary *json = [[NSDictionary alloc] init]; 
    NSError *error; 
    json = [NSJSONSerialization JSONObjectWithData:_responseData options:kNilOptions error:&error]; 
NSDictionary *test = [dataDict objectForKey:@"Servers"] 
      NSLog(@"%@", [test objectForKey:@"6"]); // Server Name (ID of server is 6) 

_responseData是剛剛從PHP腳本收到的JSON數據。

+0

你是哪裏人,在這麼遠嗎?顯示代碼。你能收到字典嗎? – Wain

+0

您的「服務器」 - 鍵嵌套在「數據」鍵中,因此必須先調用objectForKey:@「data」,然後再使用「服務器」再次調用該結果。簽出Zaph的答案。他的jsonDict是你的_responseData。 –

+0

如果一切都失敗,請閱讀NSDictionary的文檔。 –

回答

3

你會做這樣的事情:

[test enumerateKeysAndObjectsUsingBlock:^(NSString* serverId, NSString *serverName, BOOL *stop) { 
    // Process data here. 
}]; 
0

這將在Objective-C中用一個字典來表示,所以你會想要做下面的事情。我假設您將服務器的響應存儲在名爲myServerResponse的變量中,該變量是一本字典。

NSDictionary *data = myServerResponse[@"data"]; 
NSDictionary *server = data[@"Servers"]; 
for (NSString *key in server) { 
     NSString *serverId = key; 
     NSString *serverName = server[key]; 
} 

編輯:製造dataserver字典。
編輯Zaph:添加@前綴鑰匙串,糾正@ 「服務器」

+0

這就是你快速僞代碼時會發生的情況!感謝您接受這一點。 –

4
NSDictionary *jsonDict = @{@"success":@"true", 
          @"errors":@[], 
          @"data":@{ 
           @"Servers":@{ 
            @"6":@"Name here" 
            } 
           } 
          }; 

NSDictionary *servers = jsonDict[@"data"][@"Servers"]; 
NSString *serverID = [[servers allKeys] firstObject]; 
NSLog(@"serverID: %@", serverID); 

輸出:

SERVERID:6

對於多個服務器:

for (NSString *serverId in servers) { 
    NSString *serverName = servers[serverId]; 
    NSLog(@"server key: %@, serverId: %@", serverId, serverName); 
} 

或使用枚舉:

[servers enumerateKeysAndObjectsUsingBlock:^(NSString* serverId, NSString *serverName, BOOL *stop) { 
    NSLog(@"server serverId: %@, serverName: %@", serverId, serverName); 
}]; 
+0

雖然這得到了答案,但我覺得它避免了問題的關鍵。這並不是一句好話,但顯然他需要處理每個*服務器,而不僅僅是第一個。 – SefTarbell

+0

增加了一個用於處理所有密鑰的聲音。 – zaph