Как разобрать строку JSON в iphone Objective - C? - PullRequest
0 голосов
/ 16 августа 2011

Привет, я пытаюсь разобрать строку JSON в iphone, и до сих пор я смог правильно получить значение JSON

, но после этого я получаю сообщение об ошибке:

-[__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 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];
}

Ответы [ 3 ]

4 голосов
/ 16 августа 2011

Немного 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 и т. Д., А затем сохранить их массив.

2 голосов
/ 16 августа 2011

Синтаксис JSON представляет как массивы, так и словари.При анализе «неизвестного» фрагмента кода JSON вы не знаете, является ли данный «слой лука» массивом или словарем, поэтому вы должны проверить (на каждом уровне), чтобы увидеть, какой у вас объект.Используйте [myObject isKindOfClass:[NSArray class]] и [myObject isKindOfClass:[NSDictionary class]].

Также не лишено смысла делать эту проверку даже с «известными» источниками JSON, так как веб-сайты могут сломаться или измениться, и лучше представить хорошее сообщение об ошибке (ивинить веб-сайт), а не сбой вашего приложения.

2 голосов
/ 16 августа 2011

Этот пост должен помочь.

Здесь есть несколько хороших примеров: http://iosdevelopertips.com/cocoa/json-framework-for-iphone-part-2.html

...