JSON 문자열에서 반환 된 Objective-C의 null 값 확인
나는이 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 == 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
가장 좋은 답변은 Aaron Hayman이 수락 된 답변 아래에 언급 한 내용입니다.
if ([tel isKindOfClass:[NSNull class]])
경고를 생성하지 않습니다. :)
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];
나는 보통 다음과 같이한다.
Assuma I have a data model for the user, and it has an NSString property called email, fetched from a JSON dict. If the email field is used inside the application, converting it to empty string prevents possible crashes:
- (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:@""];
}
In Swift you can do:
let value: AnyObject? = xyz.objectForKey("xyz")
if value as NSObject == NSNull() {
// value is null
}
Best would be if you stick to best practices - i.e. use a real data model to read JSON data.
Have a look at JSONModel - it's easy to use and it will convert [NSNUll null] to * nil * values for you automatically, so you could do your checks as usual in Obj-c like:
if (mymodel.Telephone==nil) {
//telephone number was not provided, do something here
}
Have a look at JSONModel's page: http://www.jsonmodel.com
Here's also a simple walk-through for creating a JSON based app: http://www.touch-code-magazine.com/how-to-make-a-youtube-app-using-mgbox-and-jsonmodel/
I tried a lot method, but nothing worked. Finally this worked for me.
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
}
Try this:
if (tel == (NSString *)[NSNull null] || tel.length==0)
{
// do logic here
}
I use this:
#define NULL_TO_NIL(obj) ({ __typeof__ (obj) __obj = (obj); __obj == [NSNull null] ? nil : obj; })
if we are getting null value like then we can check it with below code snippet.
if(![[dictTripData objectForKey:@"mob_no"] isKindOfClass:[NSNull class]])
strPsngrMobileNo = [dictTripData objectForKey:@"mobile_number"];
else
strPsngrMobileNo = @"";
Here you can also do that by checking the length of the string i.e.
if(tel.length==0)
{
//do some logic here
}
'developer tip' 카테고리의 다른 글
numpy 배열에 0 만 포함되어 있는지 테스트 (0) | 2020.10.13 |
---|---|
LLDB (Swift) : 원시 주소를 사용 가능한 유형으로 캐스팅 (0) | 2020.10.13 |
Linux에서 R에 사용할 수있는 IDE는 무엇입니까? (0) | 2020.10.13 |
장고에서 현재 언어를 얻는 방법은 무엇입니까? (0) | 2020.10.13 |
Perl에서 키가 주어진 배열에서 나온 해시를 어떻게 생성합니까? (0) | 2020.10.13 |