[〜#〜] 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 == nil
とmyString == NULL
の条件を使用してみました
さらに、これについて読むためのiOSドキュメントの最適な場所はどこですか?
<null>
は、NSNullシングルトンが記録する方法です。そう:
if (tel == (id)[NSNull null]) {
// tel is null
}
(シングルトンは、nil
をコレクションクラスに追加できないために存在します。)
キャストの例を次に示します。
if (tel == (NSString *)[NSNull null])
{
// do logic here
}
また、この方法でこの着信文字列を確認することもできます:
if(tel==(id) [NSNull null] || [tel length]==0 || [tel isEqualToString:@""])
{
NSlog(@"Print check log");
}
else
{
NSlog(@Printcheck log %@",tel);
}
「不安定な」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
最良の答えは、アーロン・ヘイマンが受け入れられた答えの下にコメントしたことです:
if ([tel isKindOfClass:[NSNull class]])
警告は生成されません:)
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];
私は通常このようにします:
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:@""];
}
Swiftでできること:
let value: AnyObject? = xyz.objectForKey("xyz")
if value as NSObject == NSNull() {
// value is null
}
このように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 /
これを試して:
if (tel == (NSString *)[NSNull null] || tel.length==0)
{
// do logic here
}
私はこれを使用します:
#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
}
if([tel isEqual:[NSNull null]])
{
//do something when value is null
}