2012-03-17 5 views
0

JSONデータの取得にNSJSONSerializationを使用しようとしていますが、NSDictionaryを正しく解析できないという問題があります。NSDictionaryを使用したNSJSONSerializationデータへのアクセス

[{ "ステータス": "いいえ変数"}]

私のコードは次のようになります

... 
NSURL * url = [NSURL URLWithString:@"http://justforexamplepurposes.xyz/file.php"]; 
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60]; 
[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:[[NSString stringWithFormat:@"username=%@&password=%@", username, password] dataUsingEncoding:NSUTF8StringEncoding]]; 
NSURLResponse * response = nil; 
NSError * error = nil; 
NSData * result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
if(error == nil && result != nil) 
{ 
    NSError * json_error = nil; 
    id id_json_serialization = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingMutableContainers error:&json_error]; 
    if(json_error == nil) 
    { 
     NSDictionary * dictionary_result = (NSDictionary *) id_json_serialization; 
     NSLog(@"|>%@<|", dictionary_result); 
     NSEnumerator * enume; 
     id key; 
     enume = [dictionary_result keyEnumerator]; 
     while((key =[enume nextObject])) 
     { 
      NSLog(@"%@ : %@", key, [dictionary_result objectForKey:key]); 
     } 
    } 
} 
... 

最初のNSLogを

Webサービスは、以下を返しません

|>( { ステータス= "変数なし"; })< |

が、第2のNSLogで、それは例外をスロー:

2012-03-17 13:57:22.195でTestApp [41072:F803は] - [__ NSArrayM keyEnumerator]:未認識セレクタに送られますインスタンス0x689a9f0 2012-03-17 13:57:22.196でTestApp [41072:F803] *終了アプリによる キャッチされない例外 'NSInvalidArgumentException'、理由: ' - [__ NSArrayM keyEnumerator]:未認識セレクタインスタンス0x689a9f0に送ら' *ファーストスローコールスタック:(0x13e9022 0x157 acd6 0x13eacbd 0x134fed0 0x134fcb2 0x2a80 0x13eae99 0x3614e 0x360e6 0xdcade 0xdcfa7 0xdc266 0x5b3c0 0x5b5e6 0x41dc4 0x35634 0x12d3ef5 0x13bd195 0x1321ff2 0x13208da 0x131fd84 0x131fc9b 0x12d27d8 0x12d288a 0x33626 0x232d 0x2295)lldb)

任意の提案(例外をスロー呼ばTERMINATE?

答えて

2

サーバが実際に返すJSONは、実際には1つのオブジェクトだけの配列です。つまり、変数dictionary_resultは実際にはNSMutableArrayです。

クイックヒント:NSLog(@"|>%@<|", dictionary_result);ではなくCFShow(dictionary_result)を使用すると、CFShowがタイプを含むオブジェクトに関する多くの情報を提供するため、これを検出した可能性があります。

+0

CFShow(dictionary_result)を正しく使用するには、試してみるとObjective-Cのポインタ型 'NSDictionary *'をCのポインタ型 'CFTypeRef'に暗黙的に変換する(別名const void * )はブリッジキャストが必要です " – JohnnyAce

+0

申し訳ありません。あなたは' CFShow((__ bridgeed CFTypeRef)dictionary_result) 'をしなければならないかもしれません。 – joerick

+1

上記のコメントは 'CFShow((__ bridge CFTypeRef)dictionary_result)'でなければなりません。 – geerlingguy

関連する問題