web-dev-qa-db-ja.com

JSON文字列から返されたObjective-Cのnull値を確認する

[〜#〜] json [〜#〜] Webサーバーからのオブジェクトがあります。

ログは次のようなものです。

{          
   "status":"success",
   "UserID":15,
   "Name":"John",
   "DisplayName":"John",
   "Surname":"Smith",
   "Email":"email",
   "Telephone":null,
   "FullAccount":"true"
}

ユーザーが入力しない場合、電話はnullとして着信します。

この値をNSStringに割り当てると、NSLog<null>として出力されます

私はこのような文字列を割り当てています:

NSString *tel = [jsonDictionary valueForKey:@"Telephone"];

この<null>値を確認する正しい方法は何ですか? NSDictionaryを保存できません。

[myString length]myString == nilmyString == NULLの条件を使用してみました

さらに、これについて読むためのiOSドキュメントの最適な場所はどこですか?

77
Chris

<null>は、NSNullシングルトンが記録する方法です。そう:

if (tel == (id)[NSNull null]) {
    // tel is null
}

(シングルトンは、nilをコレクションクラスに追加できないために存在します。)

188
Wevah

キャストの例を次に示します。

if (tel == (NSString *)[NSNull null])
{
   // do logic here
}
24
Flea

また、この方法でこの着信文字列を確認することもできます:

if(tel==(id) [NSNull null] || [tel length]==0 || [tel isEqualToString:@""])
{
    NSlog(@"Print check log");
}
else
{  

    NSlog(@Printcheck log %@",tel);  

}
10
Nitin Gohel

「不安定な」APIを扱っている場合は、すべてのキーを反復処理してnullをチェックすることができます。これに対処するためのカテゴリを作成しました:

@interface NSDictionary (Safe)
-(NSDictionary *)removeNullValues;
@end

@implementation NSDictionary (Safe)

-(NSDictionary *)removeNullValues
{
    NSMutableDictionary *mutDictionary = [self mutableCopy];
    NSMutableArray *keysToDelete = [NSMutableArray array];
    [mutDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        if (obj == [NSNull null]) 
        {
            [keysToDelete addObject:key];
        }
    }];
    [mutDictinary removeObjectsForKeys:keysToDelete];
    return [mutDictinary copy];
}
@end
9
Kyle C

最良の答えは、アーロン・ヘイマンが受け入れられた答えの下にコメントしたことです:

if ([tel isKindOfClass:[NSNull class]])

警告は生成されません:)

4
kjoelbro

jsonに多くの属性がある場合、ifステートメントを使用してそれらを1つずつ確認するのは面倒です。さらに悪いのは、コードがくて保守が難しいことです。

より良いアプローチは、NSDictionaryのカテゴリを作成することだと思います。

// NSDictionary+AwesomeDictionary.h

#import <Foundation/Foundation.h>

@interface NSDictionary (AwesomeDictionary)
- (id)validatedValueForKey:(NSString *)key;
@end

// NSDictionary+AwesomeDictionary.m

#import "NSDictionary+AwesomeDictionary.h"

@implementation NSDictionary (AwesomeDictionary)
- (id)validatedValueForKey:(NSString *)key {
    id value = [self valueForKey:key];
    if (value == [NSNull null]) {
        value = nil;
    }
    return value;
}
@end

このカテゴリをインポートした後、次のことができます。

[json validatedValueForKey:key];
3
Brian

私は通常このようにします:

Assumaユーザー用のデータモデルがあり、JSON dictから取得したemailというNSStringプロパティがあります。電子メールフィールドがアプリケーション内で使用されている場合、空の文字列に変換するとクラッシュの可能性がなくなります。

- (id)initWithJSONDictionary:(NSDictionary *)dictionary{

    //Initializer, other properties etc...

    id usersmail = [[dictionary objectForKey:@"email"] copy];
    _email = ( usersmail && usersmail != (id)[NSNull null] )? [usersmail copy] : [[NSString      alloc]initWithString:@""];
}
2

Swiftでできること:

let value: AnyObject? = xyz.objectForKey("xyz")    
if value as NSObject == NSNull() {
    // value is null
    }
2
Segev

このようにnull値を取得している場合、以下のコードスニペットで確認できます。

 if(![[dictTripData objectForKey:@"mob_no"] isKindOfClass:[NSNull class]])
      strPsngrMobileNo = [dictTripData objectForKey:@"mobile_number"];
  else
           strPsngrMobileNo = @"";

ベストプラクティスにこだわるのがベストです。つまり、実際のデータモデルを使用してJSONデータを読み取ります。

JSONModelをご覧ください-使いやすく、[NSNUll null]を*nil*値に自動的に変換します。 Obj-cでの通常のチェック:

if (mymodel.Telephone==nil) {
  //telephone number was not provided, do something here 
}

JSONModelのページをご覧ください: http://www.jsonmodel.com

JSONベースのアプリを作成するための簡単なウォークスルーもここにあります: http://www.touch-code-magazine.com/how-to-make-a-youtube-app-using-mgbox-and- jsonmodel /

0
Marin Todorov

これを試して:

if (tel == (NSString *)[NSNull null] || tel.length==0)
{
    // do logic here
}
0
Mritunjay

私はこれを使用します:

#define NULL_TO_NIL(obj) ({ __typeof__ (obj) __obj = (obj); __obj == [NSNull null] ? nil : obj; }) 

私は多くの方法を試しましたが、何もうまくいきませんでした。最終的にこれは私のために働いた。

NSString *usernameValue = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"usernameKey"]];

if ([usernameValue isEqual:@"(null)"])
{
     // str is null
}
0
user5930025
if([tel isEqual:[NSNull null]])
{
   //do something when value is null
}
0