1

ボタンと 3 つのラベルを持つアプリを設計しました。

ボタンが押されると、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"
  }
]

アプリには、値、時刻、日付を表示する 3 つのラベルもあります。

私のアプリのコードは次のとおりです。

-(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 パーサーに問題はありますか?

すべての値、時刻、日付を配列に格納できますか?

配列の最後の項目をラベルに表示しますか?

どんな助けでも本当に感謝しています。

4

2 に答える 2

2

オブジェクトが辞書エントリの配列であるvalueForKey場合の動作について、一般的な混乱があるようです。jsonMidhun の答えは、辞書エントリを 1 つだけ渡すことで、1 つの方法で解決しますprocessData(これは、元のコードの の宣言が、NSString *value1 つの辞書エントリのみが渡されることを期待していたことを明確に暗示しているため、論理的な解決策でした)。

ただし、辞書の配列の 3 つの辞書キーすべての配列を取得する場合は、元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];
}

ところで、あなたのコメントの 1 つで、これらの結果をグラフ化することを括弧で囲んで言及しました。その場合、日付と時刻を組み合わせて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 データに適した日付形式文字列を使用してください。

于 2012-12-12T14:01:38.233 に答える
1

jsonパラメータとしてメソッドNSMutableArrayに渡しています。processDataNSDictionary

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

メソッド呼び出しを次のように変更します。

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

上記は最初の要素を表示します。最後の要素を表示する必要がある場合は、次を使用します。

[self processData:[json objectAtIndex:[json count]-1]];
于 2012-12-12T13:44:14.470 に答える