2014-04-20 115 views
0

我正在嘗試閱讀JSON從POST請求中獲取的內容。問題是,我無法嵌套字典。我試圖保存json,然後使用我的mac上的文件,一切正常!我用這梅索德得到來自服務器的JSON:如何正確讀取iOS上的JSON

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
     if (!connectionError) { 
      if (![[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] isEqualToString:@"{\"response\":{\"status\":\"fail\",\"message\":\"Please use a POST request.\",\"code\":4012}}"]) { 
       NSError *error; 
       NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:@"/Users/David/Downloads/Test"] options:kNilOptions error:&error]; //This returns a other JSON than the JSON stored on my mac 
       NSArray *array = [dict objectForKey:@"list"]; 
       NSMutableDictionary *mutableDict = [NSMutableDictionary new]; 
       for (NSInteger i = 0; array.count>i; i++) { 
        NSDictionary *listDictionary = [array objectAtIndex:i]; 
        NSDictionary *defenition = [listDictionary objectForKey:@"definition"]; 
        [mutableDict setObject:[defenition objectForKey:@"form"] forKey:[listDictionary objectForKey:@"term"]]; 
       } 
       NSLog(@"%@", mutableDict); 
      } 
     } 
    }]; 

現在的問題,我必須使用其他梅索德獲得從NSURLConnection的正確的JSON?

感謝

編輯

這是我下載了JSON和我有我的Mac上的內容:

{ 
    "response" : { 
    "status" : "success", 
    "code" : "200", 
    "message" : "OK" 
    }, 
    "list" : [ 
    { 
     "term" : "Black", 
     "context" : "", 
     "created" : "2014-04-17 20:34:33", 
     "updated" : "", 
     "definition" : { 
     "form" : "Schwarz", 
     "fuzzy" : 0, 
     "updated" : "2014-04-17 21:35:50" 
     }, 
     "reference" : "", 
     "tags" : [] 
    } 
    ] 
} 

這是我從字典 「字典」 獲得:

{ 
    "response" : { 
    "status" : "success", 
    "code" : "200", 
    "message" : "OK" 
    }, 
    "list" : [ 
    { 
     "term" : "Black", 
     "context" : "", 
     "created" : "2014-04-17 20:34:33", 
     "updated" : "", 
     "reference" : "", 
     "tags" : [] 
    } 
    ] 
} 

請注意,詞典「定義」已經丟失!

+0

爲什麼你從文件中讀取JSON而不是使用通過網絡接收的數據(大概是在NSData對象中)? –

+0

爲什麼你使用那個時髦的字符串比較來檢查失敗? –

+1

您正在獲得不同的值**,因爲您正在閱讀文件**。 –

回答

2

如果你可以限制你的應用程序到iOS 5.0+然後去NSJSONSerializationhttps://developer.apple.com/library/ios/documentation/foundation/reference/nsjsonserialization_class/Reference/Reference.html

如果你確實需要支持較老的iOS版本,那麼回到我身邊,我會挖掘那些黑暗日子裏常見的框架。 (我只是不記得硬它的名字)

+1

讓我爲你翻譯第一句。 「限制你的應用程序到iOS 5+」。不管怎樣,你現在甚至應該考慮限制到7+。 – Fogmeister

+0

@Fogmeister,爲什麼? NSJSONSerialization是在iOS 5中引入的。那麼,是否有任何關於NSJOSNSerialization sice的重大改進?爲了向後兼容,有時候有很好的理由。特別是當你的客戶不是蘋果的門徒,並且認爲他們3年前的企業數千個硬件設備的存貨不應該因爲額外的應用程序而變得遲鈍。關鍵是我不推薦過時的框架,因爲iOS 5是合理的,但如果David需要它,我仍然樂於提供幫助。 –

+0

我不明白這個「答案」的全部意義。 OP已經在使用NSJSONSerialization。 –

0

只是一個猜測(我總是有通過文檔挖掘找出COM協議):

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
    if (!connectionError) { 
     if (![[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] isEqualToString:@"{\"response\":{\"status\":\"fail\",\"message\":\"Please use a POST request.\",\"code\":4012}}"]) { // This test is bogus but we'll leave it for now 
      NSError *error; 
      NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 
      if (dict == nil) { 
       NSLog(@"Error deserializing JSON: %@", error); 
       // Do something 
      } 
      if (![dict isKindOfClass:[NSDictionary class]]) { 
       NSLog(@"Did not receive dictionary as outer JSON: %@", dict); 
       // Do something 
      } 
      NSArray *array = [dict objectForKey:@"list"]; 
      NSMutableDictionary *mutableDict = [NSMutableDictionary new]; 
      for (NSInteger i = 0; array.count>i; i++) { 
       NSDictionary *listDictionary = [array objectAtIndex:i]; 
       NSDictionary *defenition = [listDictionary objectForKey:@"definition"]; 
       [mutableDict setObject:[defenition objectForKey:@"form"] forKey:[listDictionary objectForKey:@"term"]]; 
      } 
      NSLog(@"%@", mutableDict); 
     } 
     else { 
      // Do something 
     } 
    } 
    else { 
     // Do something 
    } 
}]; 
+0

嗨,我可以得到NSDictionary,我知道結構。我在我的Mac上使用Cocoa JSON Editor。我用一個示例JSON文件 –

+0

@DavidG編輯了答案。 - 兩種不同版本的JSON正是 - **不同的**版本。如果你得到一個而不是另一個,那是因爲你有**不同的**數據 - 與解析JSON無關。 –

+0

你說得對,我在POST請求中忘了一個參數。對我感到羞恥!所以我得到了2個不同的JSONS –

0

,除非你需要不要使用NSURLConnection發送自定義HTTP標頭或其他東西。如果你只是想要一個基本的URL請求,而不是使用NSData自己從URL加載的能力,它會得到所有的HTTP頭和性能的東西,錯誤檢查的權利。我的示例代碼顯示瞭如何執行此操作,並且還顯示瞭如何正確使用NSURLConnection與自定義發佈數據/ etc(註釋掉)。

另外,在這種情況下不要使用sendAsynchronousRequest:。而應創建自己的異步代碼塊,以便您可以發送URL請求並在後臺線程上解碼JSON。當你真的想使用解碼數據時,退回到主線程。

NSURL *url = [NSURL URLWithString:@"http://example.com"]; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    // basic get request: 
    NSData *data = [NSData dataWithContentsOfURL:url]; 
    if (!data) { 
    NSLog(@"http error"); 
    return; 
    } 

    // more complex get or post request, where you need to send parameters or custom headers or caching 
    //NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 
    //[request setHTTPMethod:@"POST"]; 
    //[request setHTTPBody:postData]; 
    //NSHTTPURLResponse *urlResponse = nil; 
    //NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:NULL]; 
    //if (!data || [urlResponse statusCode] != 200) { 
    // NSLog(@"http error"); 
    // return; 
    //} 

    // decode json 
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; 
    if (!dict || ![dict isKindOfClass:[NSDictionary class]]) { 
    NSLog(@"error parsing json"); 
    return; 
    } 

    // now drop back to the main thread and do whatever with your dictionary 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    NSLog(@"%@", dict); 
    }); 
}); 
+0

嗨,我需要使用服裝的HTTP頭,所以我必須使用NSURLConnection。我編輯了我的問題 –