将 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' 的内容)
【问题讨论】:
在您发布的第一段代码中,arr
是nil
。在这种情况下,请记录 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? [关闭]