将 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 数组的各种元素。我希望这对某人有所帮助。
很抱歉 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 数组的各种元素。我希望这对某人有所帮助。