문제

우리는 모바일 앱에서 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;
.

}

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top