使用从 JSON 数据中提取的值时出现 NSInvalidArgumentException

Posted

技术标签:

【中文标题】使用从 JSON 数据中提取的值时出现 NSInvalidArgumentException【英文标题】:NSInvalidArgumentException when using a value extracted from JSON data 【发布时间】:2011-11-02 00:32:43 【问题描述】:

我正在尝试检索 id 的值:

"id":1,"name":"XYZ"

当我使用时:

NSString *jsonData = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
NSArray * myPeople = [jsonData JSONValue]; 

NSString *name = [[NSString alloc] init]; 
NSDictionary *person = [myPeople objectAtIndex:[indexPath row]]; 
name = [NSString stringWithString:[person valueForKey:@"id"]]; 
name = [name stringByAppendingString:@". "]; 
name = [name stringByAppendingString:[person valueForKey:@"name"]]; 
name = [name stringByAppendingString:[person valueForKey:@"id"]]; 

cell.textLabel.text = name;

我收到以下错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException'
reason: '-[NSCFNumber length]: unrecognized selector sent to instance 0x4e7f8b0

我该如何解决这个问题?

【问题讨论】:

建议:不要写“请帮助”,而是发布编译器错误的文本。 我没有使用您使用的 JSON 库,但您提供的代码看起来不错。异常说 length 正在被 NSNumber 调用,你能显示其余的代码吗? 这不是编译器错误。至少你需要了解编译时间和运行时间的区别。 【参考方案1】:

您同时调用了stringWithString:stringByAppendingString:,但随后传入了NSNumber

需要获取NSNumber的字符串值

[[person valueForKey:@"id"] stringValue];

或使用如下格式:

name = [NSString stringWithFormat:@"%@%@", name, [person valueForKey:@"id"]];

我也会考虑稍微改变一下结构,这样更容易理解:

NSDictionary *person = [myPeople objectAtIndex:[indexPath row]];
NSString *personName = [person valueForKey:@"name"];
NSSNumber *personId  = [person valueForKey:@"id"];

NSString *name = [NSString stringWithFormat:@"%@. %@ %@", personId, personName, personId];

对于排序,您要确保不会在每次设置单元格时都提取数据(看起来像这样),否则这将是一个糟糕的体验。

我相信有人可以为您指出一种更好的排序方式,但我能想到的最快的方法是

NSArray *myPeople = [[jsonData JSONValue] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) 
  return [[obj1 objectForKey:@"id"] compare:[obj2 objectForKey:@"id"]];
]

【讨论】:

我有另一个查询,我从 URL 获得的 JSON 数据是:["id":1,"name":"XYZ","id":3,"name ":"PQR","id":2,"name":"ABC"。我想在他们的 id 的亚洲以排序的形式将它们显示在一个表格的单元格中。你能指导我吗 这很有帮助!! :) 非常感谢您的帮助 嘿,只是一个简单的问题.. 你能建议我一个如何设计和实施评级字段的选项吗?我在互联网上看到有几个选项,例如我可以使用的带有数字格式化程序的文本字段、广播组、组合框。请让我知道,哪个适合以及如何实施。另外,当我在 Xcode 4 中选择 View->Utilities-> show objects Library 时,它只显示对象而不是我在 Internet 上看到的对象库,你也可以指导我吗 当您遇到问题时,最好先尝试搜索。如果您找不到答案,请提出一个新问题。如果您在 cmets 中提问,那么遇到相同问题的其他人很难找到给出的任何答案。 对不起,下次注意! :)

以上是关于使用从 JSON 数据中提取的值时出现 NSInvalidArgumentException的主要内容,如果未能解决你的问题,请参考以下文章

当 json 数据的值发布到 .net Web 服务时出现 Json Failed 错误?

Web Scraping:在 Python 中解析 JSON 时出现 KeyError

从 for 循环打印时出现问题

通过 JDBC 从 Spark 提取表数据时出现 PostgreSQL 错误

检索地震 JSON 结果时出现问题?

安装 ruby​​gems 时出现 SSL 错误,无法从“https://rubygems.org/”中提取数据