помогите разобрать значение JSON используя JSONTouch - PullRequest
0 голосов
/ 29 января 2011

У меня есть следующий json:

http://www.adityaherlambang.me/webservice.php?user=2&num=10&format=json

Я хотел бы получить все имена в этих данных с помощью следующего кода, но это дает ошибку.Как я могу это исправить?

NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];


 NSDictionary *results = [responseString JSONValue];

 NSDictionary *users = [results objectForKey:@"users"] objectForKey:@"user"];


 for (NSDictionary *user in users){
  //NSLog(@"key:%@, value:%@", user, [user objectForKey:user]);
  NSString *title = [users objectForKey:@"NAME"];
  NSLog(@"%@", title);
 }

Ошибка:

2011-01-29 00:18:50.386 NeighborMe[7763:207] -[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0xb618840
2011-01-29 00:18:50.388 NeighborMe[7763:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0xb618840'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x027d9b99 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x0292940e objc_exception_throw + 47
    2   CoreFoundation                      0x027db6ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x0274b2b6 ___forwarding___ + 966
    4   CoreFoundation                      0x0274ae72 _CF_forwarding_prep_0 + 50
    5   NeighborMe                          0x0000bd75 -[NeighborListViewController connectionDidFinishLoading:] + 226
    6   Foundation                          0x0007cb96 -[NSURLConnection(NSURLConnectionReallyInternal) sendDidFinishLoading] + 108
    7   Foundation                          0x0007caef _NSURLConnectionDidFinishLoading + 133
    8   CFNetwork                           0x02d8d72f _ZN19URLConnectionClient23_clientDidFinishLoadingEPNS_26ClientConnectionEventQueueE + 285
    9   CFNetwork                           0x02e58fcf _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl + 389
    10  CFNetwork                           0x02e5944b _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl + 1537
    11  CFNetwork                           0x02d82968 _ZN19URLConnectionClient13processEventsEv + 100
    12  CFNetwork                           0x02d827e5 _ZN17MultiplexerSource7performEv + 251
    13  CoreFoundation                      0x027bafaf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
    14  CoreFoundation                      0x0271939b __CFRunLoopDoSources0 + 571
    15  CoreFoundation                      0x02718896 __CFRunLoopRun + 470
    16  CoreFoundation                      0x02718350 CFRunLoopRunSpecific + 208
    17  CoreFoundation                      0x02718271 CFRunLoopRunInMode + 97
    18  GraphicsServices                    0x030b800c GSEventRunModal + 217
    19  GraphicsServices                    0x030b80d1 GSEventRun + 115
    20  UIKit                               0x002e9af2 UIApplicationMain + 1160
    21  NeighborMe                          0x00001c34 main + 102
    22  NeighborMe                          0x00001bc5 start + 53
    23  ???                                 0x00000001 0x0 + 1
)
terminate called after throwing an instance of 'NSException'

Я действительно просто хотел иметь возможность перебирать имена

Ответы [ 2 ]

3 голосов
/ 29 января 2011
NSDictionary *results = [responseString JSONValue];

NSDictionary *users = [results objectForKey:@"users"] objectForKey:@"user"];
  1. Данные JSON имеют массив в качестве значения верхнего уровня. Это не объект JSON, следовательно, это не словарь. Вот почему вы получаете исключение -[__NSArrayM objectForKey:]: unrecognized selector sent to instance.
  2. В ваших данных JSON нет записи "users".
  3. Приведенный выше код не компилируется.

Первый шаг - понять ваши данные JSON. Он структурирован следующим образом:

  1. значением верхнего уровня является массив
  2. каждый элемент в массиве является объектом / словарем с одним ключом, называемым «пользователь»
  3. значение ключа "пользователь" само по себе является другим объектом / словарем с различными парами ключ-значение

Если вы хотите перебрать пользователей и напечатать значение для клавиши «NAME», следуйте примеру ниже.

NSString *responseString = [[NSString alloc] initWithData:responseData
    encoding:NSUTF8StringEncoding];

// 1. the top level value is an array
NSArray *results = [responseString JSONValue];

// 2. each element in the array is an object/dictionary with
// a single key called "user"
for (NSDictionary *element in results) {
    // 3. the value of the "user" key is itself another object/dictionary
    // with various key-value pairs
    NSDictionary *user = [element objectForKey:@"user"];
    NSString *title = [user objectForKey:@"NAME"];
    NSLog(@"%@", title);
}
1 голос
/ 29 января 2011

Мне кажется, что когда вы создаете словарь "пользователи", вы фактически создаете словарь "пользователь".

 NSDictionary *users = [[results objectForKey:@"users"] objectForKey:@"user"];//crating users dictionary with 1 "user" inside.

РЕДАКТИРОВАТЬ

во втором представлении.почему бы вам просто не повторить словарь "результатов"?вот так -

 for (NSDictionary *user in result){
  //NSLog(@"key:%@, value:%@", user, [user objectForKey:user]);
  NSString *title = [users objectForKey:@"NAME"];
  NSLog(@"%@", title);
 }

надеюсь, это поможет Шани

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...