16

こんにちは、TouchJSON を使用して JSON を逆シリアル化しています。私は過去にそれを使用しており、その際、NSNull の発生を手動で処理していました。作者もこれに対処しなければならないと思うので、もう一度それを行うのはオーバーヘッドになります。その後、ドキュメントでこれを見つけました:

出力で NSNull 値を回避します。

NSData *theJSONData = /* some JSON data */
CJSONDeserializer *theDeserializer = [CJSONDeserializer deserializer];
theDeserializer.nullObject = NULL;
NSError *theError = nil;
id theObject = [theDeserializer deserialize:theJSONData error:&theError];}

私が理解している方法では、クラスのユーザーは C スタイルの null ポインターをデシリアライザーに渡すことができ、NSNull に遭遇すると、渡された値 (NULL) が挿入されます。そのため、後で値を使用すると、NSNull ではなく NULL が返されます。

これは奇妙に思えます。戻り値は、オブジェクトのみを含むことができる NSDictionary です。代わりに値のデフォルトを「nil」にすべきではありませんか?

NULL の場合、このように値を確認できますか?

if([jsonDataDict objectForKey:someKey] == NULL)

これを行うことができる方がより論理的に見えるでしょう:

if(![jsonDataDict objectForKey:someKey])

nil を渡すことは許可されていますが、NULL を渡すとクラッシュが発生するすべてのケースは言うまでもありません。

または、「nil」をデシリアライザーに渡すことはできますか?

これの多くは、私がまだ nil、NULL、[NSNULL null] に苦労していることに起因しています。おそらく、nil を使用する際の潜在的な警告を認識していないのでしょう。

4

3 に答える 3

48

別の JSON ライブラリについても、同じ問題があるため、NSDictionary で次のカテゴリを作成しました。

@implementation NSDictionary (Utility)

// in case of [NSNull null] values a nil is returned ...
- (id)objectForKeyNotNull:(id)key {
   id object = [self objectForKey:key];
   if (object == [NSNull null])
      return nil;

   return object;
}

@end

上記のライブラリから JSON データを扱うときはいつでも、次のような値を取得します。

NSString *someString = [jsonDictionary objectForKeyNotNull:@"SomeString"];

このようにして、私のプロジェクトのコードはよりクリーンになり、同時に [NSNull null] 値などの処理について考える必要がなくなりました。

于 2011-04-19T16:14:07.410 に答える
15

nilNULL実際には両方ともゼロに等しいので、実際には互換性があります。しかし、その通りです。一貫性を保つために、TouchJSONのドキュメントでは。theDeserializer.nullObject = nilの代わりに使用する必要がありNULLます。

これを行うと、2番目の述語は実際に正常に機能します。

if (![jsonDataDict objectForKey:someKey])

(または)nullObjectに設定すると、TouchJSONは辞書からキーを省略します。キーがディクショナリに存在しない場合、NSDictionaryはnilを返します。これはゼロであるため、if条件は期待どおりに機能します。nilNULL

nullObjectとして指定しない場合はnil、代わりに次のようにnullをチェックできます。

if ([jsonDataDict objectForKey:someKey] == [NSNull null])
于 2011-04-19T16:02:30.367 に答える