NULL에 NULL에 NULL PARSE PARSE에 AFNETWORKING을 얻을 수 있습니까?
-
12-12-2019 - |
문제
우리는 모바일 앱에서 AfnetWorking을 사용하고 있으며 많은 시간을 많이 사용하면 일부 가치에 대해 NULL이 있습니다.
나는 다음을 수행하는 것에 지쳤습니다.
if ([json objectForKey:@"nickname"] isKindOfClass:[NSNull class]]) {
nickname = nil;
} else {
nickname = [json objectForKey:@"nickname"];
}
.
JSON 응답에서 값이 NULL이면 AFNETWORKING을 AFNETWORKING을 자동으로 NIL 또는 숫자로 설정하도록 설정할 수 있습니다.
해결책
사전은 키를위한 객체로 nil
를 포함 할 수 없으므로 실제로 가능하지 않습니다.열쇠는 당신이 원하는 행동을 얻기 위해 전적으로 전적으로 중단되어야합니다. 이는 자체 방식으로 바람직하지 않습니다.
수신 한 데이터를 통제하지 않았으며 JSON에 어떤 키가 있었는지 알지 못했습니다.그들을 모두 나열하거나 테이블에 표시하고, 널 객체의 키가 사전에서 나오는 키가 잘못된 목록을 볼 수 있습니다.
NSNull
는 코코아 컬렉션의 "아무것도"자리 표시 자이며, 이는이 경우에 사용되는 이유입니다.
매크로로 조금 더 쉽게 입력 할 수 있습니다.
#define nilOrJSONObjectForKey(JSON_, KEY_) [[JSON_ objectForKey:KEY_] isKindOfClass:[NSNull class]] ? nil : [JSON_ objectForKey:KEY_]
nickname = nilOrJSONObjectForKey(json, @"nickname");
. 다른 팁
AFHTTPSESSIONMANAGER 응답 SETREMOVESKEYSWITHNULLVALUES를 YES로 설정할 수 있습니다.
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:url sessionConfiguration:config];
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
[serializer setRemovesKeysWithNullValues:YES];
[manager setResponseSerializer:serializer];
. DV_의 답변은 afhttpsessionmanager에게 훌륭하게 작동합니다.그러나 관리자 대신 afhttpRequestoperation을 사용하는 경우 다음을 시도하십시오.
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
serializer.removesKeysWithNullValues = YES;
op.responseSerializer = serializer;
. Minced https://github.com/hyperoslo/minced JSON 응답에서 NULL을 처리하는 데 도움이되는 뭔가를하십시오.null 대신 빈 문자열을 넣습니다.
기본 NSJSONSerialization을 Sbjson으로 바꾸면 문제가 해결됩니다.
sbjson은 nsjsonserialization의 "null"
의 선택 대신 객체를 낳습니다.사용할 수있는 다른 JSON 파서의 요구 사항을 살펴보십시오. https://github.com/afnetworking/afnetworking#requirements
이 기능에서 사용자 정의 Afnetworking을 사용할 수 있습니다.모든 값을 null
객체에 설정하십시오.static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions) {
if ([JSONObject isKindOfClass:[NSArray class]]) {
NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:[(NSArray *)JSONObject count]];
for (id value in (NSArray *)JSONObject) {
[mutableArray addObject:AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions)];
}
return (readingOptions & NSJSONReadingMutableContainers) ? mutableArray : [NSArray arrayWithArray:mutableArray];
} else if ([JSONObject isKindOfClass:[NSDictionary class]]) {
NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithDictionary:JSONObject];
for (id <NSCopying> key in [(NSDictionary *)JSONObject allKeys]) {
id value = (NSDictionary *)JSONObject[key];
if (!value || [value isEqual:[NSNull null]]) {
// custom code here
//[mutableDictionary removeObjectForKey:key];
[mutableDictionary setObject:@"" forKey:key];
} else if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]]) {
mutableDictionary[key] = AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions);
}
}
return (readingOptions & NSJSONReadingMutableContainers) ? mutableDictionary : [NSDictionary dictionaryWithDictionary:mutableDictionary];
}
return JSONObject;
.
}