将 JSON 格式的 NSString 转换为 NSArray 失败

Conversion of NSString in JSON format to NSArray fails

很抱歉 post 还有一个关于转换为 NSArray 的问题,但即使在阅读了数十篇关于同一问题的 post 之后我仍然无法解决这个问题。看起来真的很容易,但是...

- (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]);
}

这是输出:

list as a string: [{"id":"1","name":"example name","filename":"image.png"}]
count: 0

数组计数怎么会是0?数组中显然只有一项。

我不想让这个 post 不必要地复杂化,但这可能很重要,所以开始吧。传递给此函数的字符串由服务器以加密格式返回。所以在它被传递到这里之前,它首先经过一个看起来像这样的解密过程:

- (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 的主要转换看起来非常简单,所以这里一定有更多的事情要做。 (如果不清楚,字符串 'decrypted' 是传递给 'parseList' 的内容)

好吧,我想通了。完全归功于@rmmaddy,我意识到我的数组是零。当我添加一个 NSLog 语句来检查错误时,我发现了这个:

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Garbage at end.)

我发现 JSON 字符串中至少有一个空终止字符需要在我尝试解析它之前删除。我添加了这一行:

str = [str stringByReplacingOccurrencesOfString:@"[=10=]" withString:@""];

开始我的方法。这有点 hacky,但你能做什么?

为了完整起见,这里是成功解析 JSON 字符串的完整方法:

- (void) parseList : (NSString *) str {
    str = [str stringByReplacingOccurrencesOfString:@"[=11=]" 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 数组的各种元素。我希望这对某人有所帮助。