【问题标题】:'NSInvalidArgumentException' while running an application using NSURL and NSJSON使用 NSURL 和 NSJSON 运行应用程序时出现“NSInvalidArgumentException”
【发布时间】:2012-11-30 05:17:46
【问题描述】:

我设计了一个应用,它有一个按钮和三个标签。

按下按钮时,会调用一个 URL。 URL 的 JSON 表示如下:

[
  {
    "_id": "50c87e8a1898044ea1458e4c",
    "value": "10",
    "time": "12:10",
    "date": "12.12.12"
  },
  {
    "_id": "50c87f311898044ea1458e4d",
    "value": "12",
    "time": "13:15",
    "date": "12.12.12"
  }
]

我的应用中还有三个标签,分别显示值、时间和日期。

我的应用代码如下:

-(IBAction)getrequest:(id)sender
{
    NSURL *url =[NSURL URLWithString:@"http://localhost:3000/lights"];
    NSData* data = [NSData dataWithContentsOfURL:url];
    //fetch the data to the JSON Foundation opject.
    [self performSelectorOnMainThread:@selector(fetchedData:)
                           withObject:data waitUntilDone:YES];
}

- (void)fetchedData:(NSData *)responseData {
    NSError *e = nil;
    NSMutableArray *json = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&e];
    NSLog(@"%@", json);
        [self processData:json];
}

-(void)processData:(NSDictionary *) JSONObject{
    NSString        *value = [JSONObject valueForKey:@"value"];
    NSString        *date    = [JSONObject valueForKey:@"date"];
     NSString        *time    = [JSONObject valueForKey:@"time"];


    NSLog(@"value: %@", value);
    NSLog(@"date: %@", date);
    NSLog(@"time: %@", time);

    _value.text = value;
    _date.text = date;
    _time.text = time;

}

代码编译和构建没有任何错误,但是当我在模拟器中按下按钮时,出现如下异常:

2012-12-12 14:16:21.115 Sensor_visulization[7956:11303] value: (
    10,
    12
)
2012-12-12 14:16:21.116 Sensor_visulization[7956:11303] date: (
    "12.12.12",
    "12.12.12"
)
2012-12-12 14:16:21.116 Sensor_visulization[7956:11303] time: (
    "12:10",
    "13:15"
)
2012-12-12 14:16:21.116 Sensor_visulization[7956:11303] -[__NSArrayI isEqualToString:]: unrecognized selector sent to instance 0x7191a30
2012-12-12 14:16:21.117 Sensor_visulization[7956:11303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI isEqualToString:]: unrecognized selector sent to instance 0x7191a30'

我的 json 解析器有问题吗?

我可以将所有的值、时间、日期存储在一个数组中吗?

并在标签上显示数组中的最后一项?

任何帮助将不胜感激。

【问题讨论】:

  • 一切看起来都很好,除了最后,您尝试将_value.text(可能是NSString 属性)设置为value(这是一个数组,而不是字符串)。您希望在NSString 中表示数组的精确度如何?你可以做_value.text = [value description];_value.text = [value componentsJoinedByString:@", "]; 或其他。
  • @Rob 我通过下面描述的方法让它工作了。不过还是谢谢。但是我怎样才能在一个数组中获取所有值,并且始终在一个单独的数组中获取所有值并绘制一个图表,一个轴上的值和另一个轴上的时间?
  • 查看我更新的答案,其中显示了如何保存三个单独的数组(以及检索 UI 控件的最后一个对象)。关于图表的草图,这取决于您如何绘制图表,这是一个完全不同的问题。为此,我建议您提交关于该主题的另一个问题,展示您在绘制此数据方面尝试过的示例。但希望我们已经解决了您关于如何获取值数组的问题。
  • 顺便说一句,如果这是针对具有单独日期和时间数组的图表应用程序,则可能并不完全有用。您可能希望将这两个组合成一个日期时间对象数组(可能是NSDate 对象)。有关如何组合它们的示例,请参阅我的更新答案。

标签: ios json url exception


【解决方案1】:

当您的 json 对象是一个字典条目数组时,对于 valueForKey 的作用似乎普遍存在混淆。 Midhun 的回答以一种方式解决了这个问题,即只将一个字典条目传递给 processData(这是一个合乎逻辑的解决方案,因为您的原始代码声明 NSString *value 清楚地暗示您希望只将一个字典条目传递给它)。

但是,如果你想为你的字典数组获取所有三个字典键的数组,你可以使用你原来的 fetchedData,并使用 valueForKey 反对原来的 json 对象返回 NSArray 对象.为此,我建议对您的原始代码稍作修改:

- (void)fetchedData:(NSData *)responseData {
    NSError *e = nil;
    NSMutableArray *json = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&e];
    NSLog(@"%@", json);
    [self processData:json];
}

-(void)processData:(NSDictionary *) JSONObject{

    // get the three array structures

    NSArray *value = [JSONObject valueForKey:@"value"];
    NSArray *date  = [JSONObject valueForKey:@"date"];
    NSArray *time  = [JSONObject valueForKey:@"time"];

    // these log statements demonstrate that value, date, and time are arrays

    NSLog(@"value: %@", value);
    NSLog(@"date:  %@", date);
    NSLog(@"time:  %@", time);

    // now, let's grab the last object from each to populate our controls

    _value.text = [value lastObject];
    _date.text = [date lastObject];
    _time.text = [time lastObject];
}

顺便说一句,在您的一个 cmets 中,您在括号中提到了想要绘制这些结果的图表。如果是这种情况,我可能会想象您需要将日期和时间组合到 NSDate 对象中。如果您希望它们作为 NSDate 对象,您可以:

-(void)processData:(NSDictionary *) JSONObject{

    // get the values

    NSArray *value = [JSONObject valueForKey:@"value"];

    // get the datetimes

    NSMutableArray *datetimes = [NSMutableArray array];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"dd.MM.yy HH:mm";
    formatter.locale = [NSLocale currentLocale];

    for (NSDictionary *dictionary in JSONObject)
    {
        NSString *datetimeString = [NSString stringWithFormat:@"%@ %@", [dictionary objectForKey:@"date"], [dictionary objectForKey:@"time"]];
        NSDate *datetime = [formatter dateFromString:datetimeString];
        [datetimes addObject:datetime];
    }

    NSLog(@"values=%@", values);
    NSLog(@"datetimes=%@", datetimes);

因为您的示例数据包含今天的唯一日期 12/12/12,所以我无法确定您的日期格式,所以我猜您使用的是 dd.MM.yy,但显然使用对您的 JSON 有意义的任何日期格式字符串数据。

【讨论】:

  • 当我添加你的代码时,我得到一个错误“NSString 没有可见的接口声明选择器 lastobject”有帮助吗??
  • @Kishorepandey 我的代码基于您的原始问题,在该问题中您是NSLog'ing value 变量并且您得到了一个数组。如果您有一个数组并且想要获取该数组中的最后一个对象,请使用我的答案代码。我想知道您是否在集成 Midhun MP 的答案后尝试使用我的代码,但这是行不通的。请参阅我更新的答案,其中我包含了整个 processData 方法,以消除任何歧义,并且我相信它可以实现这两个目标,获取所有三种类型的数组,同时检索三个控件的最后一个。
  • 太棒了!!非常感谢队友。我只有最后一个查询,您更喜欢哪个 IOS 类在数组中绘制这些元素。 x轴上的值和y上的时间?有什么建议吗??
  • @Kishorepandey 我从来没有做过图表,但在这种情况下经常讨论核心情节。如果您搜索 StackOverflow,您会看到大量出色的答案。
【解决方案2】:

json 是一个NSMutableArray,您将它作为NSDictionary 参数传递给processData 方法。

 NSMutableArray *json = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&e];

改变方法调用如下:

[self processData:[json objectAtIndex:0]];

上面将显示第一个元素。如果您需要显示最后一个元素,请使用:

[self processData:[json objectAtIndex:[json count]-1]];

【讨论】:

  • 非常感谢朋友。有效。我还有一个小查询,如何获取数组中的所有元素。例如:一个由值组成的数组,一个日期数组和一个时间数组?我想至少收集一个数组中的最后五个元素。提前致谢。
  • @Kishorepandey:很高兴老兄:)
  • 伙伴,在使用它时,我只为数组中的最后一个元素调用该函数。如何保持数组值、日期、时间中的所有元素完好无损,并且只显示 _value.text、_date.text、_time.text 中的最后一个元素?任何帮助将非常感激。我想将这些元素保留在数组中的原因是,我将进一步使用它来生成绘图。
猜你喜欢
  • 2012-09-04
  • 1970-01-01
  • 2013-10-27
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2013-06-16
相关资源
最近更新 更多