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

Posted

技术标签:

【中文标题】将 JSON 格式的 NSString 转换为 NSArray 失败【英文标题】:Conversion of NSString in JSON format to NSArray fails 【发布时间】:2015-04-13 15:39:52 【问题描述】:

很抱歉发布另一个关于转换为 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","name":"example 名称","文件名":"image.png"]计数: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 的主要转换似乎如此简单,以至于这里肯定有更多的事情发生。 (如果不清楚,字符串 'decrypted' 就是传入 'parseList' 的内容)

【问题讨论】:

在您发布的第一段代码中,arrnil。在这种情况下,请记录 err,以便您查看问题所在。 你是对的。不敢相信我没有注意到这一点。错误是这样的:Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Garbage at end.)。那里一定有一些不可打印的字符。现在如何识别和删除它们... 对不起,笨蛋。数组在 JSON 中使用方括号。没关系。 NSLog(@"data: %@", data);,可能有一些尾随字节没有出现在str 中。 AES128Operation 的细节可能很重要,padding 是如何完成的,是 key 和 iv 正确的长度等。 【参考方案1】:

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

Error Domain=NSCocoaErrorDomain Code=3840 "无法执行该操作 完全的。 (Cocoa 错误 3840。)”(最后是垃圾。)

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

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

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

为了完整起见,这里是成功解析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 数组的各种元素。我希望这对某人有所帮助。

【讨论】:

以上是关于将 JSON 格式的 NSString 转换为 NSArray 失败的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 数据从 NSData 转换为 NSDictionary

将 JSON 数据的 NSString 转换为 NSArray [关闭]

将 NSString 转换为具有日期格式的 NSString 块

如何将 NSString 从 JSON 转换为 NSDictionary? [关闭]

以 00:00:00 时钟格式将 NSTimeInterval 转换为 NSString

React Native - nsnumber类型的json值'0'无法转换为nsstring