2015-04-13 2 views
1

Извините, что вы отправили еще один вопрос о преобразовании в NSArray, но я не могу заставить его работать даже после чтения десятков сообщений по одной и той же проблеме. Кажется, очень легко, но ...Преобразование NSString в формате JSON в NSArray не удается

- (void) parseList : (NSString *) str { 

    NSLog(@"list as a string: %@", str); 

    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; 

    if (!data) NSLog(@"no data"); 

    NSError *err = nil; 
    NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&err]; 

    NSLog(@"count: %lu", (unsigned long)[arr count]); 
} 

Это выход:

список в виде строки: [{ "ID": "1", "имя": "Пример название" , "filename": "image.png"}]
count: 0

Каким может быть массив 0? В массиве явно есть один элемент.

Я не хочу излишне усложнять это сообщение, но это может быть важно, так что здесь. Строка, которая передается в эту функцию, возвращается сервером в зашифрованном формате. Поэтому, прежде чем она будет передана здесь, он первым проходит через процесс дешифрования, который выглядит следующим образом:

- (NSString *) decryptBase64EncodedString : (NSString *) base64EncodedCipherTextString 
        base64EncodedIvString : (NSString *) base64IvString 
{ 

    NSData *cipherData = [[NSData alloc] initWithBase64EncodedString:base64EncodedCipherTextString options:0]; 
    NSData *ivData = [[NSData alloc] initWithBase64EncodedString:base64IvString options:0]; 

    NSData *data = [self AES128Operation : kCCDecrypt 
          cipherTextData : cipherData 
            ivData : ivData]; 

    NSString *decrypted = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

    return decrypted; 
} 

Я не думаю, что внутренности этой функции важно, так много, кроме, возможно, последние две строки, которые укажите, как эта строка создается (из NSData). Это может быть ни здесь, ни там, но основное преобразование в NSArray кажется настолько простым, что здесь должно быть что-то большее. (если не ясно, строка «расшифрована» - это то, что передается в «parseList»)

+3

В первом блоке кода, который вы отправили, 'arr' is' nil'. В этом случае log 'err', чтобы вы могли понять, в чем проблема. – rmaddy

+1

Вы правы. Не могу поверить, что я этого не замечал. Ошибка заключается в следующем: 'Error Domain = NSCocoaErrorDomain Code = 3840" Операция не может быть завершена (ошибка Cocoa 3840.) "(Garbage at end.)'. Там должны быть некоторые непечатаемые символы. Теперь, как определить и удалить их ... – Alex

+0

Извините, мозг. Массивы используют квадратные скобки в JSON. Неважно. – rmaddy

ответ

0

Ну, я понял это. С полным доверием к @rmmaddy, я понял, что мой массив был нулевым. Когда я добавил NSLog заявление, чтобы исследовать ошибку, я нашел это:

Ошибка домена = NSCocoaErrorDomain Code = 3840 «Операция не может быть завершена (Cocoa ошибка 3840.).» (Garbage в конце.)

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

str = [str stringByReplacingOccurrencesOfString:@"\0" withString:@""]; 

к началу моего метода. Это немного взломанно, но что вы можете сделать?

Для полноты здесь полный метод, который успешно анализирует строку JSON:

- (void) parseList : (NSString *) str { 
    str = [str stringByReplacingOccurrencesOfString:@"\0" withString:@""]; 

    NSLog(@"list as a string: %@", str); 

    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; 

    if (!data) NSLog(@"no data"); 

    NSError *err = nil; 
    NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&err]; 

    if (!arr) NSLog("%@", err); 

    NSLog(@"count: %lu", (unsigned long)[arr count]); 
} 

И мой выход остается прежним, за исключением, что граф массив теперь 1, как это должно быть, и теперь я может продолжать фактически анализировать различные элементы массива JSON. Надеюсь, это поможет кому-то.

Смежные вопросы