how to parse a JSON string in iphone Objective - C?
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 开发者_C百科 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];
}
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.
This post should help.
There are some good examples here: http://iosdevelopertips.com/cocoa/json-framework-for-iphone-part-2.html
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.
精彩评论