JSON 문자열에서 반환 된 Objective-C의 null 값 확인


78

나는이 JSON의 웹 서버에서 오는 개체를.

로그는 다음과 같습니다.

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

사용자가 입력하지 않으면 전화가 null로 표시됩니다.

A와이 값을 할당 할 때 NSString에서, NSLog그것은으로 나오고<null>

다음과 같은 문자열을 할당합니다.

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

<null>값 을 확인하는 올바른 방법은 무엇입니까 ? 이로 인해 NSDictionary.

나는 조건을 사용하여 시도 [myString length]myString == nilmyString == NULL

또한 iOS 문서에서 이에 대해 읽을 수있는 가장 좋은 위치는 어디입니까?

답변:


189

<null>NSNull 싱글 톤이 기록하는 방법입니다. 그래서:

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

( nil컬렉션 클래스에 추가 할 수 없기 때문에 싱글 톤이 존재합니다 .)


41
당신은 캐스트없이하고 싶은 경우에, 당신은 또한 시도 할 수 있습니다 :if ([tel isKindOfClass:[NSNull class]])
아론 헤이

우리가 사용할 수있는 경우 (객체 ISEQUAL : [NSNull 널 (null)]) {--logic here--}
Gajendra K 차우

24

다음은 캐스트의 예입니다.

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

또는 if (tel == (NSString *) NSNull.null) {// 여기서 로직 수행}
Raphael Oliveira

10

다음과 같이 수신 문자열을 확인할 수도 있습니다.

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

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

}

첫 번째 NSLog줄이 잘못되었습니다. 문자열 비어 있다고 표시되어야합니다 . 그리고 그 경우 왜 그것을 인쇄합니까?
bdesham

조언을 해주셔서 감사 드리며 NSLog어떤 조건이 참인지 아는 것만으로 인쇄 합니다
Nitin Gohel 2013

9

"불안정한"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

4

가장 좋은 답변은 Aaron Hayman이 수락 된 답변 아래에 언급 한 내용입니다.

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

경고를 생성하지 않습니다. :)


3

json에 속성이 많은 경우 if문을 사용하여 하나씩 확인하는 것이 번거 롭습니다. 더 나쁜 것은 코드가보기 흉하고 유지하기 어렵다는 것입니다.

더 나은 접근 방식은 다음과 같은 범주를 만드는 것입니다 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];

2

나는 보통 다음과 같이한다.

Assuma 사용자를위한 데이터 모델이 있으며 JSON dict에서 가져온 이메일이라는 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
    }

질문은 Swift가 아닌 Objective-C에 관한 것입니다.
JasonMArcher 2014

4
@JasonMArcher 대답은 여전히 ​​Google 검색에서 질문에 오는 사람들에게 약간의 가치를 제공합니다. 결국 4 년된 질문입니다.
Beau Nouvelle 2015

0

모범 사례를 고수하는 것이 가장 좋습니다. 즉, 실제 데이터 모델을 사용하여 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/


해당 JSONModel 사이트가 여전히 존재합니까? 영어가 아니기 때문에 확신 할 수는 없지만 JSON과는 관련이없는 것 같습니다.
Stewart Macdonald

0

많은 방법을 시도했지만 아무것도 효과가 없었습니다. 마침내 이것은 나를 위해 일했습니다.

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

if ([usernameValue isEqual:@"(null)"])
{
     // str is null
}

0
if([tel isEqual:[NSNull null]])
{
   //do something when value is null
}

경고 생성 : 'NSNull * _Nonnull'을 'Class'유형의 매개 변수로 보내는 호환되지 않는 포인터 유형
Adnan Asghar

0

이 시도:

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


0

다음과 같이 null 값을 얻으면 아래 코드 스 니펫으로 확인할 수 있습니다.

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

-6

여기에서 문자열의 길이를 확인하여이를 수행 할 수도 있습니다.

if(tel.length==0)
{
    //do some logic here
}

3
아니요, tel의 인스턴스 인 NSNull경우 예외가 발생합니다.
Kurt 개정

그래, 난 우리가 그것의 널 (null) 여부를 also.We 확인해야합니다 또한 위의 조건을 고려 있다고 생각
라훌 나랑
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.