1

これは私のJSON出力です

{"activitiesList":{"auid":"19UG9IZ","comments":"Please enter Description","createDate":"09/19/2012 07:32:56 AM","id":"19UG9IZ","owner":"04256CRM","response":"Missing Response","status":"Assigned","type":"Request Action"}}

以下のコードは、単一の activitiesList を持つ上記の出力ではなく、複数の activitiesList がある場合に機能します

@try {
    NSError* error;
    NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
    NSArray* activityListFromSiebel = [json objectForKey:@"activitiesList"]; //2
    NSLog(@" Count is %d", [activityListFromSiebel count]);
    for (int i = 0; i < [activityListFromSiebel count]; i++) {
        //if ([activityListFromSiebel count] > 1) {
            NSDictionary* completeActivity = [activityListFromSiebel objectAtIndex:i];

            ObjActivityData *dataActivity = [[ObjActivityData alloc] init];
            dataActivity.activityUID      = [completeActivity objectForKey:@"auid"];
            dataActivity.activitytype     = [completeActivity objectForKey:@"type"];
            dataActivity.activityStatus   = [completeActivity objectForKey:@"status"];
            dataActivity.activityOpenedDt = [completeActivity objectForKey:@"createDate"];
            dataActivity.activityDueDt    = @"";
            dataActivity.activityDesc     = [completeActivity objectForKey:@"comments"];
            dataActivity.activityResponse = [completeActivity objectForKey:@"response"];
            [Activities addObject:dataActivity];
            dataActivity = nil;
        //}
    }
    [self.tableView reloadData];
} @catch (NSException * e) {
    NSLog(@"catching %@ reason %@", [e name], [e reason]);
} @finally {
    NSLog(@"finally");
}

スローされた try/catch エラーは NSInvalidArgumentException 理由 -[__NSCFArray 長さ]: 認識されないセレクターがインスタンス 0x68c8e90 に送信されました。出力が 1 つの配列要素だけの場合、JSON 出力を別の方法で解析する必要があります。感謝の助け

ありがとう

4

1 に答える 1

0

これを行う、

id obj = [json objectForKey:@"activitiesList"];
NSArray* activityListFromSiebel = nil;

if ([obj isKindOfClass:[NSArray class]]) {
    activityListFromSiebel = (NSArray *)obj;
} else {
    activityListFromSiebel = [NSArray arrayWithObject:obj];
}

問題は、コードを使用しようとするとき、それ[json objectForKey:@"activitiesList"];が配列であると想定していることですが、実際には単一のアイテムしか存在しない場合、それは単なる辞書です。forループを渡してelse部分で辞書をオブジェクトに変換する ObjActivityDataか、現在使用しているforループの前にこれを簡単な修正として追加することができます。

したがって、コードは次のようになります。

NSError* error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

id obj = [json objectForKey:@"activitiesList"];
NSArray* activityListFromSiebel = nil;

if ([obj isKindOfClass:[NSArray class]]) {
    activityListFromSiebel = (NSArray *)obj;
} else {
    activityListFromSiebel = [NSArray arrayWithObject:obj];
}

NSLog(@" Count is %d", [activityListFromSiebel count]);
for (int i = 0; i < [activityListFromSiebel count]; i++) {
    //if ([activityListFromSiebel count] > 1) {
        NSDictionary* completeActivity = [activityListFromSiebel objectAtIndex:i];

        ObjActivityData *dataActivity = [[ObjActivityData alloc] init];
        dataActivity.activityUID      = [completeActivity objectForKey:@"auid"];
        dataActivity.activitytype     = [completeActivity objectForKey:@"type"];
        dataActivity.activityStatus   = [completeActivity objectForKey:@"status"];
        dataActivity.activityOpenedDt = [completeActivity objectForKey:@"createDate"];
        dataActivity.activityDueDt    = @"";
        dataActivity.activityDesc     = [completeActivity objectForKey:@"comments"];
        dataActivity.activityResponse = [completeActivity objectForKey:@"response"];
        [Activities addObject:dataActivity];
        dataActivity = nil;
    //}
}
[self.tableView reloadData];
于 2012-11-28T22:41:03.313 に答える