Замена нулей пустой строкой из ответа JSON не работает в iOS

Я использовал приведенный ниже код для замены нулей из ответа json пустой строкой, но он не работает. Пожалуйста, помогите мне решить эту проблему, я получаю нули от ответа сервера во многих сценариях и сбоях приложения.

Код:

- (NSMutableDictionary *)recursive:(NSMutableDictionary *)dictionaryResponse {

    NSMutableDictionary *dictionary=[[NSMutableDictionary alloc]initWithDictionary:dictionaryResponse];
    for (NSString *key in [dictionary allKeys]) {
        id nullString = [dictionary objectForKey:key];
        if ([nullString isKindOfClass:[NSDictionary class]]) {
            [self recursive:(NSMutableDictionary*)nullString];
        }else if([nullString isKindOfClass:[NSArray class]]){
            for (int i=0; i<[nullString count]; i++) {
                id nullstr = [nullString objectAtIndex:i];

                if ([nullstr isKindOfClass:[NSDictionary class]]) {
                    [self recursive:(NSMutableDictionary*)nullstr];

                }

            }
        }else {
            if ((NSString*)nullString == (id)[NSNull null])
                [dictionary setValue:@"" forKey:key];
        }
    }
    return dictionary;
}

person Raj    schedule 04.11.2014    source источник
comment
Можете ли вы зарегистрировать свой проанализированный словарь (только часть, представляющая вашу нулевую строку), это поможет нам всем решить вашу проблему.   -  person Yuvrajsinh    schedule 04.11.2014
comment
-1 и закрыть голосование, т.к. не работает не адекватное описание вашей проблемы. Если он дает сбой, вы должны включить сообщение об исключении COMPLETE и трассировку стека.   -  person Hot Licks    schedule 04.11.2014
comment
Я сделал категорию, которая делает это. Вы можете найти его здесь github.com/bismasaeed00/NullReplacer.   -  person bisma    schedule 21.04.2017


Ответы (3)


попробуй это:

- (NSMutableDictionary *)recursiveNullRemove:(NSMutableDictionary *)dictionaryResponse {

    NSMutableDictionary *dictionary = [dictionaryResponse mutableCopy];
    NSString *nullString = @"";
    for (NSString *key in [dictionary allKeys]) {
        id value = dictionary[key];

        if ([value isKindOfClass:[NSDictionary class]]) {

            dictionary[key] = [self recursiveNullRemove:(NSMutableDictionary*)value];  

        }else if([value isKindOfClass:[NSArray class]]){

            NSMutableArray *newArray = [value mutableCopy];
            for (int i = 0; i < [value count]; ++i) {

                id value2 = [value objectAtIndex:i];

                if ([value2 isKindOfClass:[NSDictionary class]]) {
                    newArray[i] = [self recursiveNullRemove:(NSMutableDictionary*)value2];                    
                }
                else if ([value2 isKindOfClass:[NSNull class]]){
                    newArray[i] = nullString;
                }
            }
            dictionary[key] = newArray;
        }else if ([value isKindOfClass:[NSNull class]]){
            dictionary[key] = nullString;
        }
    }
    return dictionary;
}

ОТРЕДАКТИРОВАНО:

Я нашел проблему в своем ответе, и теперь она исправлена

это код проверки:

NSDictionary *dict = @{@"1" : @{@"1.1": @"value", @"1.2" : [NSNull null]},
                       @"2" : @[@"2.1", @{@"2.2.1" : @"val", @"2.2.2" : [NSNull null]}],
                       @"3" : [NSNull null]};

dict = [self recursiveNullRemove:dict];
person mityaika07    schedule 04.11.2014

вот простой способ удалить Null из строки

-(NSString *) removeNull:(NSString *) string
{
    NSRange range = [string rangeOfString:@"null"];
    if (range.length > 0 || string == nil) {
       string = @"";
    }
    string = [self trimString:string];
    return string;
}

-(NSString*) trimString:(NSString *)theString
{
    NSString *theStringTrimmed = [theString stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
    return theStringTrimmed;  
}
person Mitul Bhadeshiya    schedule 25.12.2014

person    schedule
comment
Использование == для проверки NSNull является правильным и правильным. - person Hot Licks; 04.11.2014
comment
Конечно, имеет, так как сбой не имеет ничего общего с операцией сравнения. - person Hot Licks; 05.11.2014