如何解析iphone Objective-C中的JSON字符串?

时间:2011-08-16 10:49:53

标签: iphone objective-c json parsing sbjson

您好我正在尝试解析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];
}

3 个答案:

答案 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源进行此检查也不是不明智的,因为网站可能会中断或更改,并且最好提供一个很好的错误消息(并责怪网站),而不是让您的应用程序崩溃。