2011-08-16 7 views
0

こんにちは私はiphoneでJSON文字列を解析しようとしていますし、これまでのところ、私は正しくiphoneでJSON文字列を解析する方法Objective - C?

をJSON値を取得することができたが、その後、私はエラーをgetingています:

HERESに
-[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x62242e0 
2011-08-16 16:11:58.792 BleepBleep[4083:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x62242e0' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x010a9be9 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x011fe5c2 objc_exception_throw + 47 
    2 CoreFoundation      0x010ab6fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
    3 CoreFoundation      0x0101b366 ___forwarding___ + 966 
    4 CoreFoundation      0x0101af22 _CF_forwarding_prep_0 + 50 
    5 BleepBleep       0x0000733f -[Screen1 network:didFinishLoadingWithRequest:data:] + 79 
    6 BleepBleep       0x0000b7e4 -[WNetwork handleResponse] + 323 
    7 BleepBleep       0x0000b69b -[WNetwork connectionDidFinishLoading:] + 36 
    8 Foundation       0x00077172 -[NSURLConnection(NSURLConnectionReallyInternal) sendDidFinishLoading] + 108 
    9 Foundation       0x000770cb _NSURLConnectionDidFinishLoading + 133 
    10 CFNetwork       0x01674606 _ZN19URLConnectionClient23_clientDidFinishLoadingEPNS_26ClientConnectionEventQueueE + 220 
    11 CFNetwork       0x0173f821 _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl + 293 
    12 CFNetwork       0x0166ae3c _ZN19URLConnectionClient13processEventsEv + 100 
    13 CFNetwork       0x0166acb7 _ZN17MultiplexerSource7performEv + 251 
    14 CoreFoundation      0x0108b01f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
    15 CoreFoundation      0x00fe928b __CFRunLoopDoSources0 + 571 
    16 CoreFoundation      0x00fe8786 __CFRunLoopRun + 470 
    17 CoreFoundation      0x00fe8240 CFRunLoopRunSpecific + 208 
    18 CoreFoundation      0x00fe8161 CFRunLoopRunInMode + 97 
    19 GraphicsServices     0x019de268 GSEventRunModal + 217 
    20 GraphicsServices     0x019de32d GSEventRun + 115 
    21 UIKit        0x002e442e UIApplicationMain + 1160 
    22 BleepBleep       0x00002018 main + 102 
    23 BleepBleep       0x00001fa9 start + 53 
) 
terminate called after throwing an instance of 'NSException' 

私はコード

{ 
    SBJSON *parser = [SBJSON new];  
    NSString *dataString = [[NSString alloc] initWithData:mRespData encoding:NSUTF8StringEncoding]; 


    NSMutableDictionary *newDic = [dataString JSONValue]; 

    if ([(id)mDelegate respondsToSelector:@selector(network:didFinishLoadingWithRequest:data:)]) { 
     [self.mDelegate network:self didFinishLoadingWithRequest:mReqType data:newDic]; 
    } 
    [newDic autorelease]; 

    [dataString release]; 
    [parser release]; 
} 
:私はDISコードを使用していたネットワーククラスにdidFinishLoadingWithRequest

-(void)network:(WNetwork*)network didFinishLoadingWithRequest:(NSInteger)pReq data:(NSMutableDictionary*)pData 
{ 
    [self removeLoader]; 

    switch (pReq) { 
     case JBJsonParser: 
     { 
      NSArray *parsedString = [pData objectForKey:@"placesname"]; 
      DLog(@"LIST %@",parsedString); 
     } 
    break;  
     default: 
      break; 
} 

} 

に使用します3210

+0

d文字列mは誰でもd形式を望む場合にjstを解析しようとしています http://beepbeepapp.com/showplaces.php – IphoneBites

答えて

4

リトルビット:

:これはJSON 辞書ある

["firstValue", "secondValue"] 

これはJSON 配列です

{ 
"A key" : "A value", 
"Another key" : "Another value" 
} 

JSONは、パーサーにルートタイプがの配列であることを伝えています。したがって、jsonValueは配列を返しています。 その配列に対してobjectForKey(NSDictionaryメソッド)を呼び出そうとしています。だからこそ例外がスローされました。

JSONを投稿して、構造とその解析方法を確認してください。または、jsonValueを格納しているオブジェクトをログに記録してみてください。


UPDATE:

あなたのJSONを読んだ後、これはあなたがそれを解析する方法である。

NSString *jsonString; // set this to your json 
NSArray *places = [jsonString jsonValue]; 
// then iterate through the places, saving off the bits you need 
for (NSDictionary *place in places) { 
    NSString *placeName = [place objectForKey:@"placesname"]; // for example 
    NSLog(@"Name of place: %@", placeName); 
} 

あなたがしたいかもしれないものがある場所というカスタムクラスを作成することですlat、long、placenameなどのプロパティを取得し、それらの配列を保存します。

+0

もっと簡単に言えますか? – IphoneBites

+0

もう少し説明しました –

+0

NSDictionaryメソッドまたは配列を使用する必要がありますか?無効にする必要があります NSArray * parsedString = [pData objectForKey:@ "placesname"]; または NSDictionary * parsedString = [pData objectForKey:@ "placesname"]; – IphoneBites

2

JSON構文は、配列と辞書の両方を表します。 「未知」のJSONコードを解析するとき、特定の「タマネギのレイヤー」が配列か辞書かわかりませんので、どのレベルのオブジェクトを持っているかを調べる必要があります。 [myObject isKindOfClass:[NSArray class]][myObject isKindOfClass:[NSDictionary class]]を使用してください。

ウェブサイトが壊れたり変更されたりする可能性があるため、「既知の」JSONソースでもこのチェックを行うのは賢明ではありません。アプリクラッシュさせるのではなく、素晴らしいエラーメッセージを表示して。

+0

これはなぜdownvotedか分かりません。これは、正確かつ有益な対応です。 – JaredH