您好我正在尝试解析iphone中的JSON字符串,到目前为止我已经能够正确获取JSON VALUE
但在那之后我发现了一个错误:
-[__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'
这是我在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;
}
}
在我正在使用dis代码的网络类中:
{
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];
}
答案 0 :(得分:4)
JSON的一点点:
这是一个JSON 数组:
["firstValue", "secondValue"]
这是一个JSON 字典:
{
"A key" : "A value",
"Another key" : "Another value"
}
您的JSON告诉解析器根类型是数组。因此,jsonValue
返回一个数组。
您正尝试在该阵列上调用objectForKey
(NSDictionary方法)。这就是抛出异常的原因。
请发布您的JSON,以便我们可以看到结构以及您应该如何解析它。或者,尝试记录存储jsonValue的对象。
<强>更新强>
阅读完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);
}
你可能想要做的是创建一个名为place的自定义类,它具有lat,long,placename等属性,然后保存一组数组。
答案 1 :(得分:2)
这post应该会有所帮助。
这里有一些很好的例子: http://iosdevelopertips.com/cocoa/json-framework-for-iphone-part-2.html
答案 2 :(得分:2)
JSON语法表示数组和字典。在解析“未知”的JSON代码时,您不知道给定的“洋葱层”是否是数组或字典,因此您必须检查(在每个级别)以查看您拥有的对象类型。使用[myObject isKindOfClass:[NSArray class]]
和[myObject isKindOfClass:[NSDictionary class]]
。
即使使用“已知”JSON源进行此检查也不是不明智的,因为网站可能会中断或更改,并且最好提供一个很好的错误消息(并责怪网站),而不是让您的应用程序崩溃。