Канал API JSON, используемый нашим приложением iOS ObjectiveC, немного шелушился, поэтому иногда поле равно null.Устойчивость в JSON-анализе с ObjectiveC
При анализе JSON мы используем
NSDictionary *json = [self JSONFromResponseObject:responseObject];
Тогда попробуйте использовать поля с, например,
[widgetIDArray addObject:widget[@"name"][@"id"]];
Где иногда поле «имя» будет пустым. Есть ли у нас:
1) Попросите поставщика API, чтобы очистить их слоеное код API
2) Проверьте нуль каждый раз, когда мы пытаемся использовать что-то из JSon Словаре
if (![widget[@"name"] isKindOfClass:[NSNull class]])
3) Использование попробовать - поймать
@try {
[widgetIDArray addObject:widget[@"name"][@"id"]];
}
@catch (NSException *exception)
{
NSLog(@"Exception %@",exception);
}
оТВЕТ:
спасибо за ответы, ниже. Вот добавление к NSObject, которое я добавил, что позволяет мне получать глубоко вложенные элементы JSON, которые могут или не могут присутствовать.
Первый вызов с чем-то вроде
self.item_logo = [self valueFromJSONWithKeyArray:event withKeyArray:@[@"categories",@"bikes",@"wheels",@"model",@"badge_uri"]];
Вот код в NSObject + extensions.m
- (id) valueFromJSONWithKeyArray:(id)json withKeyArray:(NSArray *)keyArray
{
for (NSString * keyString in keyArray)
{
if ([json[keyString] isKindOfClass:[NSObject class]])
{
json = json[keyString]; // go down a level
}
else
{
return nil; // we didn't find this key
}
}
return json; // We successfully found all the keys, return the object
}
Благодаря gnash, я расширил свой NSDictionary с помощью ключа ValueFromDict: (NSString *). Он возвращает false, если NULL или объект. –
Итак, он будет разбиваться позже, если вместо строки будет число? Если предполагается, что возвращаются только строки, то зачем вызывать его valueFromDict, а не stringFromDict? Почему «FromDict», если он находится в расширении NSDictionary? Нет смысла говорить «FromDict», особенно не «FromDict», за которым следует ключ? – gnasher729