1

オブジェクトが特定のキーで利用可能であることをどのように識別できますか。私は次のことを試しました:

for(NSDictionary *item in jsonArray){
if([item objectForKey:@"EventDate"])
        NSLog([item objectForKey:@"EventDate"]);
}

これはエラーでコードをクラッシュさせています:

  -[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x6a567b0

また、キーが存在しない場合に表示される多くの投稿objectForKeyが返されることもわかりました。nil私の質問よりも、NSDictionaryクラスには「setNilValueForKey」というメソッドもあります。NSDictionarynilオブジェクトでキーを指定できず、オブジェクトのnil値を設定する方法があるのはどうしてですかNSDictionary

最初に提案し、2 番目のクエリについても明確にしてください。

4

4 に答える 4

2

1) jsonArray にはNSDictionaries、少なくとも 1 つの を含む、以外のタイプのオブジェクトが含まれていNSStringます。NSStringobjectForKey: に応答しないため、呼び出そうとすると例外がスローされます。JSON を調べて、実行していたことを続行する方法を決定する必要があります。

2)キーバリューコーディングに関連するNSObject方法があります。setNilValueForKey:これは実際には関係ありませんNSDictionary。辞書で本当に nil を表す必要がある場合は、nil[NSNull null]を表すキーのオブジェクトとして設定します。

お役に立てれば!

于 2012-08-30T08:19:32.530 に答える
1

配列内のすべてのオブジェクトが辞書であるとは限りません。作業する前に、処理しているデータの種類を確認する必要があります。このようなもの:

for(NSObject* item in jsonArray) {
  if ([item isKindOfClass:[NSDictionary class]]) {
    // do dictionary stuff
  }
  else if ([item isKindOfClass:[NSString class]]) {
    // do string stuff
  }
}
于 2012-08-30T08:29:15.830 に答える
1

item は NSDictionary ではなく、文字列です。したがって、辞書ではなく文字列のみが含まれている可能性があるjsonArrayを確認してください

于 2012-08-30T08:16:39.843 に答える
0

2 番目のクエリへの回答

NSNull と呼ばれる nil 以外のオブジェクトがあります。これは、「プレーンな」nil が受け入れられない状況で nil を表すために特別に作成されたものです。nils を[NSNull null]オブジェクトに置き換えると、NSDictionary はそれらを受け取ります。ただし、途中で NSNull を確認する必要があります。

詳しくはこちらを参照

最初のクエリへの回答

for(id *item in jsonArray)
{
  if([item isKindofClass:[NSDictionary class])
  {
    NSArray *allKeys = [item allKeys];
    for(NSString *strKey in allKeys)
    {
     if([strKey isEqualToString:@"EventDate"])
     {
       // EventDate key has object
       NSLog([item objectForKey:@"EventDate"]);
     }
    }
  }
}
于 2012-08-30T08:18:49.217 に答える