2013-02-14 5 views
1

Я написал следующий код, но я продолжаю получать нуль. Я пробовал много разных вариантов этого, но я терпел неудачу исключительно тяжело.JSON Objective-C Parsing Fail

Это то, что я получаю с сервера. Два объекта.

[{ "Описание": "Yolo.", "Имя": "вы", "идентификатор": 1}, { "Описание": "СМИТ", "имя": "Джон",» id ": 2}]

Любая помощь будет принята с благодарностью ...... Спасибо.

NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError]; 
    SBJsonParser *jsonParser = [[SBJsonParser alloc] init]; 
    NSArray *jsonObjects = [jsonParser objectWithData:response]; 
    NSMutableString *yolo = [[NSMutableString alloc] init]; 

      for (int i = 0; i < [jsonObjects count]; i++) { 
       NSDictionary *jsonDict = [jsonObjects objectAtIndex:i]; 
       NSString *IDID = [jsonDict objectForKey:@"id"]; 
       NSString *name = [jsonDict objectForKey:@"name"]; 

       NSLog(@"ID: %@", IDID); // THIS DISPLAYS 

       [yolo appendString: IDID]; // THIS seems to be causing the new error... 
       [yolo appendString:@": "]; 
       [yolo appendString: name]; 
       NSLog(@"%@", yolo);   // RETURNS NIL  
    } 

EDIT:

В настоящее время моя новая ошибка ...

Нагрузочного приложение из-за неперехваченное исключением 'NSInvalidArgumentException', причина: «- [длина NSDecimalNumber]: непризнанного селектор отправлено на экземпляр 0x81b89f0 '

+0

Можете ли вы регистрировать ответ и jsonObjects перед циклом for? –

+1

Я довольно новичок в программировании на iOS, но разве вам не нужно «alloc» и «init' yolo? –

+0

Благодарю всех вас ... я хотел бы дать вам все отметки. спасибо за исправление моих глупых ошибок -_- – freedom

ответ

3

Похоже, ваш [jsonDict objectForKey:@"id"] является NSNumber (или NSDecimalNumber), а не NSString. Вы должны изменить линию NSString *IDID = [jsonDict objectForKey:@"id"]; к,

id myObject = [jsonDict objectForKey:@"id"]; 
NSString *IDID = nil; 

if ([myObject isKindOfClass:[NSNumber class]]) { 
    IDID = [[jsonDict objectForKey:@"id"] stringValue]; 
} else { 
    IDID = [jsonDict objectForKey:@"id"]; 
} 

Эта ошибка появилась сейчас, поскольку ранее не были инициализацией NSMutableString *yolo и вы использовали appendString: на нулевой объект. Поскольку теперь он инициализируется как NSMutableString *yolo = [[NSMutableString alloc] init];, он пытается позвонить appendString по адресу NSMutableString объект, который принимает только NSString типа в качестве своих входов, где вы проходите мимо NSNumber. length - это метод, который внутренне вызывает appendString:. Поэтому вам тоже нужно это изменить.

2

Вы никогда не инициализируете yolo, так что это всего лишь nil все время, когда вы звоните -appendString:. Попробуйте следующее:

NSMutableString *yolo = [NSMutableString string]; 
+0

спасибо за понимание ... проверьте обновление. В настоящее время я получаю эту ошибку. Исправлено приложение из-за неотображенного исключения «NSInvalidArgumentException», причина: '- [NSDecimalNumber length]: нераспознанный селектор, отправленный в экземпляр 0x81b89f0' – freedom

2

Вы пытались инициализировать NSMutableString?

NSMutableString *yolo = [[NSMutableString alloc] init]; 
+0

спасибо за понимание ... проверьте обновление. В настоящее время я получаю эту ошибку. Исправлено приложение из-за неотображенного исключения «NSInvalidArgumentException», причина: '- [NSDecimalNumber length]: нераспознанный селектор, отправленный в экземпляр 0x81b89f0' – freedom

1

Похоже, вы действительно не проверяете тип данных, поступающих в ваше приложение через ваш канал JSON. Это может быть случай случайных сбоев, когда пользователи фактически используют ваше приложение. Это может быть также причиной отказа от App Store, такие сбои происходят во время обзора вашего приложения.

Вы должны проверять тип всех объектов, которые вы получаете от JSON, перед вызовом методов на них :)

Реализуя лучшие практики вы будете иметь стабильное и полезное приложение. Создайте модели данных для проверки ваших данных. Вы также можете использовать модель данных JSON, например JSONModel: http://www.jsonmodel.com/

0

Из ваших данных видно, что «id» - это не строка, а число. Назначение указателя на NSString * не волшебным образом преобразует его в NSString *. И это очевидно из того исключения, которое вы получили, что какой-то объект является NSDecimalNumber, когда вы думали, что это будет NSString.

So: IDID - это NSNumber * и притворяется, что это NSString * приведет к сбоям.