Я предполагаю, что вы используете библиотеку JSON отсюда: https://github.com/stig/json-framework
Вы жалуетесь на то, что предоставленный вами код хрупок, но, как вам кажется, ситуация выглядит так, как вы хотитеявляется хрупким, так что я думаю, что код, который обращается к нему, может быть хрупким, если вы помещаете туда NSAsserts, чтобы вы знали как можно скорее, когда ваши предположения были нарушены.код, который вы показали, заключается в том, что он предполагает, что вы возвращаете NSArrays, когда из того, как вы к нему обращаетесь, видно, что он фактически дает вам NSDictionaries.
Например, читая ваш код, я заключаю, что responseString представляет собой вложенную карту JSON, выглядящую примерно так:
{ "d": { "data": { "hat": "baseball cap" } } }
Тогда возникает вопрос: «Ожидаете ли вы когда-нибудь значение, соответствующееключ "шляпа", чтобы когда-либо иметь более одного значения? "Я бы обобщил этот код так:
NSString* responseString = [[[NSString alloc] initWithData: responseData encoding: NSUTF8StringEncoding] autorelease];
[responseData release];
id json = [responseString JSONValue];
id hatJSONValue = [json valueForKeyPath:@"d.data.hat"];
NSString* result = nil;
if ([hatJSONValue isKindOfClass: [NSArray class]] && [hatJSONValue count] == 1)
{
result = [[hatJSONValue lastObject] description];
}
else
{
NSAssert(NO, @"Assumptions about returned JSON were wrong.");
}
NSLog(@"the hat json is .. %@", result);
Вообще говоря, вам всегда приходится искать компромисс между написанием нехрупкого кода и выполнением задач.Ключ должен заключаться в том, что если ваш код будет делать предположения, вы должны утверждать, что они верны, поэтому, если ситуация когда-либо изменится, вы будете знать!