how to parse a JSON string in iphone Objective - C

2020-08-02 11:30发布

问题:

Hi i am trying to parse a JSON string in iphone and so far i have been able to get JSON VALUE correctly

but after that i am geting an error:

-[__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'

Heres the code i am using in 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;
}

}

in the network class i am using dis code:

{
    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];
}

回答1:

This post should help.

There are some good examples here: http://iosdevelopertips.com/cocoa/json-framework-for-iphone-part-2.html



回答2:

Little bit of JSON:

This is a JSON array:

["firstValue", "secondValue"]

This is a JSON dictionary:

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

Your JSON is telling the parser that the root type is an array. Therefore, jsonValue is returning an array. You are trying to call objectForKey (NSDictionary method) on that array. That's why the exception was thrown.

Please post your JSON so we can see the structure and how you should parse it. Or, try logging the object you store jsonValue to.


UPDATE:

After reading your JSON, this is how you should parse it:

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); 
}

What you might want to do is create a custom class called place which has a property for lat, long, placename etc. and then save an array of those.



回答3:

JSON syntax represents both arrays and dictionaries. When parsing an "unknown" piece of JSON code, you don't know whether a given "layer of the onion" is an array or dictionary, so you must check (at each level) to see what kind of object you have. Use [myObject isKindOfClass:[NSArray class]] and [myObject isKindOfClass:[NSDictionary class]].

It's also not unwise to do this checking even with "known" JSON sources, since web sites can break or change, and it's better to present a nice error message (and blame the web site) rather than have your app crash.