iPhone JSON Framework не анализирует строковый объект JSON вне объекта или массива
Я использую инфраструктуру JSON в Obj-C (iOS) для анализа ответов от веб-службы RESTful (C#/.NET).
Фреймворк хорош, когда речь идет о массивах или объектах, но один из вызовов службы возвращает строку:
Необработанное значение (в памяти на сервере): 41SIdX1GRoyw1174duOrewErZpn/WatH
Значение JSON в http-ответе, закодированном WCF:"41SIdX1GRoyw1174duOrewErZpn\/WatH"
Это нормально обрабатывается аналогами JSON-фреймворков на Android, Windows Phone 7 и, конечно же, jQuery. Сервер также иногда возвращает исключение.NET WebFaultException, которое автоматически сериализует сообщение об ошибке как "Error message here"
,
JSON Framework возвращается с ошибкой: Token 'string' not expected before outer-most array or object
Кто-нибудь знает, как я могу декодировать строку JavaScript в Objective C?
спасибо Крис
2 ответа
Я думаю, вы говорите, что используемая вами среда JSON не может обрабатывать значение как крайнюю сущность в строке JSON - она ожидает объект или массив. Если это так, было бы просто проверить первый непробельный символ для '[' или '{', и, если не один из них, предположить, что это значение.
Проще говоря, вы всегда можете заключить входную строку в '[' ']' перед подачей ее в анализатор JSON, а затем "отбросить" внешний одноэлементный массив перед наблюдением за данными. Это позволяет анализатору JSON обрабатывать любой формат значения.
-(NSString*)handleResponseAsString:(NSString*)data{
if(data==nil || [data length] == 0) return nil;
NSString* retVal = nil;
SBJsonParser* parser = [[SBJsonParser alloc] init];
NSArray* items = [parser objectWithString:[NSString stringWithFormat:@"[%@]", data]]; // enclose in [] so that the parser thinks it's an array
if([parser error] == nil)
{
if([items count] > 0) retVal = (NSString*) [items objectAtIndex:0];
else NSLog(@"handleResponseAsString parser error: the array had zero elements");
}else{
NSLog(@"handleResponseAsString error: '%@' could not be decoded due to error: %@", data, [parser error]);
}
[parser release];
return retVal;
}