2014-09-23 30 views
0

我很努力讓iOS應用程序連接到運行OpenTok的節點服務器。事情工作正常,當我硬編碼值,但我想動態會話和令牌,因此我的問題。在iOS上從服務器獲取json令牌 - OpenTok

我能夠成功創建在服務器端的令牌,它看起來像:

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://path/to/json"]]; 
NSData *theData = [NSURLConnection sendSynchronousRequest:request 
             returningResponse:nil 
                error:nil]; 

NSMutableArray *newJSON = [NSJSONSerialization JSONObjectWithData:theData options:NSJSONReadingMutableContainers error:nil]; 

NSString* kToken = [newJSON valueForKey:@"sessionId"]; 
NSString* kSessionId = [newJSON valueForKey:@"token"]; 

我可以:

[ 
    { 
    "_id": "*******", 
    "token": "***********************", 
    "sessionId": "********", 
    } 
] 

我也成功地檢索它的iOS應用打印值與控制檯:

NSLog(@"Value of kToken = %@", kToken); 
NSLog(@"Value of kSessionId = %@", kSessionId); 

因此,我知道它正在正確閱讀,但無論我仍然出現錯誤:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI length]: unrecognized selector sent to instance 0x14d97950 

我比較新的到iOS所以也許我咬掉比我更可以嚼在這裏,但在正確的方向任何意見將是巨大的。在文檔中似乎沒有關於如何通過iOS正確地從服務器獲取令牌的任何內容。

+0

你能告訴我你的輸出json – sanjeet 2014-09-23 05:19:03

+0

NSArray不響應長度,它響應計數,這意味着你試圖獲得數組的長度,這就是爲什麼你得到這個錯誤 – sanjeet 2014-09-23 05:20:52

回答

1

這JSON:

[ 
    { 
    "_id": "*******", 
    "token": "***********************", 
    "sessionId": "********", 
    } 
] 

是一個數組內。

此代碼:

NSString* kToken = [newJSON valueForKey:@"sessionId"]; 

詢問陣列(newJSON)來提取它的每個元素sessionId,並在一個新的數組返回它們(這就是valueForKey:一樣)。所以,你的東西你得到了NSString,但你沒有,你真的得到了NSArray。所以,以後,當你將它用作字符串時,你會得到一個異常,因爲該數組沒有length方法。

嘗試這種情況:

NSString* kToken = [[newJSON objectAtIndex:0] objectForKey:@"sessionId"]; 

或優選改變JSON因此它不會在陣列返回的對象。

請注意,你應該基本上總是使用objectForKey:而不是valueForKey:(好吧,直到你正確理解後者在做什麼)。

+0

完美解決它。我沒有意識到數據是一個數組。任何意見,以幫助檢測?如打印出變量類型的方法? – stoves 2014-09-23 15:19:31

+0

JSON可以直接讀取,括號類型有含義。您還可以記錄返回的不同容器的「類」,以檢查您認爲的內容。 – Wain 2014-09-23 15:39:44

相關問題