0

この JSON を iOS で解析する必要があります。

{
"log_by_dates": {
    "logs": [
        {
            "date": "Wednesday 5 December 2012",
            "exercises": "0",
            "workouts": "0",
            "log_entries": "0"
        },
        {
            "date": "Tuesday 4 December 2012",
            "exercises": "4",
            "workouts": "2",
            "log_entries": "7"
        }
    ]
 }
}

それを解析するために次のコードを書きました。

NSArray *logs = [[(NSDictionary*)results objectForKey:@"log_by_dates"] objectForKey:@"logs"];
        for (NSDictionary *aLog in logs) {
            Log *newLog = [[Log alloc] initWithDate:[aLog objectForKey:@"date"]               withExercises:[aLog objectForKey:@"exercises"]
                                       withWorkouts:[aLog objectForKey:@"workouts"]];
            if (!data) {
               data = [[NSMutableArray alloc] init];
            }

しかし、問題は、時々、このような JSON 値を取得することです。

{

"log_by_dates": {
    "logs":
        {
            "date": "Wednesday 5 December 2012",
            "exercises": "0",
            "workouts": "0",
            "log_entries": "0"
        }
  }
} 

これにより、コードがクラッシュします。

辞書または配列を処理する適切なコードを記述できるように、解析する前に、着信 JSON オブジェクトに単一のレコードの複数のレコードが含まれているかどうかを確認するために使用する if() else 条件を教えてください。ありがとう、

4

3 に答える 3

1

このようにコードを更新してください。

NSArray *logs = [[(NSDictionary*)results objectForKey:@"log_by_dates"] objectForKey:@"logs"];
if([logs isKindOfClass:[NSArray class]]) {
    for (NSDictionary *aLog in logs) {
        Log *newLog = [[Log alloc] initWithDate:[aLog objectForKey:@"date"]               withExercises:[aLog objectForKey:@"exercises"]
                                   withWorkouts:[aLog objectForKey:@"workouts"]];
        if (!data) {
            data = [[NSMutableArray alloc] init];
        }
    }
}
else if([logs isKindOfClass:[NSDictionary class]]) {
    NSDictionary *aLog = (NSDictionary *)logs;
    Log *newLog = [[Log alloc] initWithDate:[aLog objectForKey:@"date"]               withExercises:[aLog objectForKey:@"exercises"]
                               withWorkouts:[aLog objectForKey:@"workouts"]];
    if (!data) {
        data = [[NSMutableArray alloc] init];
    }
}
于 2012-12-05T06:58:14.797 に答える
0

のような状態を確認してください

if([[[(NSDictionary*)results objectForKey:@"log_by_dates"] objectForKey:@"logs"] isKindOfClass:[NSArray class]])
{
    // Do your Array Stuff Here
} else {
    // Do your Dictionary Stuff Here
}
于 2012-12-05T07:00:15.020 に答える
0

forこれをループの前に挿入します。

if (![logs isKindOfClass:[NSArray class]])
{
    logs = [NSArray arrayWithObject:logs];
}
于 2012-12-05T07:16:29.347 に答える