2

複数のデータの次のリストがあり、NSPredicate を使用して男性を除外したいのですが、どうすればよいですか

[
  "Human": {
    "Person": {
      "isMale": true,
      "name": "PersonA",
      "id": "100"
    },
    "isCheck": true
  },
  "Human": {
    "Person": {
      "isMale": false,
      "name": "PersonB",
      "id": "200"
    },
    "isCheck": false
  },
  .
  .
  .
  .
]

配列には辞書が含まれており、各辞書には単一の人物辞書が含まれており、内部辞書の人物キーを除外したいと考えています。どんな助けでも大歓迎です。

4

5 に答える 5

4

ウェインの答えはうまくいくでしょう。

あなたの質問から形成されたjsonファイルを使用するこのコードスニペットを試してください。

NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Humans" ofType:@"json"];
NSData *data = [[NSData alloc]initWithContentsOfFile:filePath];
NSArray *users = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Human.Person.isMale == %@",@true];

NSArray *filteredArray = [users filteredArrayUsingPredicate:predicate];
NSLog(@"%@",filteredArray);

Humans.jsonファイル

于 2013-05-29T07:11:55.737 に答える
2

Person.isMale内部辞書に移動する必要があるため、述語で使用する必要があります。

[NSPredicate predicateWithFormat:@"Person.isMale == %@)", [NSNumber numberWithBool:YES]];
于 2013-05-29T06:49:17.263 に答える
1

KVCをチェックしましたか?

これを試して :

[NSPredicate predicateWithFormat:@"(Human.Person.isMale == 1)"];
于 2013-05-29T06:48:26.873 に答える
1

これを試して

NSString *valueString = @"true"

NSPredicate *myPredicate = [NSPredicate predicateWithBlock:^BOOL(id       evaluatedObject, NSDictionary *bindings) {

 if([[[[evaluatedObject objectForKey:@"Human"] objectForKey:@"Person"] objectForKey:@"isMale"] isEqualToString:valueString])
                return YES;

            return NO;

        }];

NSArray *filteredArray = [yourArray filteredArrayUsingPredicate:myPredicate];
于 2013-05-29T14:43:51.710 に答える