Question

Nous utilisons AFNetworking dans notre application mobile et nous aurons souvent un retour JSON qui a null pour certaines valeurs.

J'en ai marre de faire ce qui suit.

if ([json objectForKey:@"nickname"] isKindOfClass:[NSNull class]]) {
    nickname = nil;
} else {
    nickname = [json objectForKey:@"nickname"];
}

Que pouvons-nous faire pour qu'AFNetworking définisse automatiquement les objets sur zéro ou les nombres sur 0 si la valeur est nulle dans la réponse JSON ?

Était-ce utile?

La solution

Ce n'est pas vraiment possible, puisque le dictionnaire ne peut pas contenir nil comme objet pour une clé.La clé devrait être entièrement laissée de côté pour obtenir le comportement souhaité, ce qui serait indésirable à sa manière.

Supposons que vous n'ayez aucun contrôle sur les données que vous receviez et que vous ne sachiez pas quelles clés étaient présentes dans le JSON.Si vous vouliez tous les lister ou les afficher dans un tableau et que les clés des objets nuls étaient exclues du dictionnaire, vous verriez une liste incorrecte.

NSNull est l'espace réservé "rien" pour les collections Cocoa, et c'est pourquoi il est utilisé dans ce cas.

Vous pourriez faciliter votre saisie avec une macro :

#define nilOrJSONObjectForKey(JSON_, KEY_) [[JSON_ objectForKey:KEY_] isKindOfClass:[NSNull class]] ? nil : [JSON_ objectForKey:KEY_]

nickname = nilOrJSONObjectForKey(json, @"nickname");

Autres conseils

Vous pouvez définir le drapeau SETREMOVESKESKESKEYSWITHNULLULLULES TO YES dans AFHTTTPSESSIpessionManager Serializer:

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:url sessionConfiguration:config];
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
[serializer setRemovesKeysWithNullValues:YES];
[manager setResponseSerializer:serializer];

La réponse de DV_ est excellente pour AFHTTPSessionManager.Mais si vous utilisez AFHTTPEQUESTOPERATION au lieu du gestionnaire, essayez ceci:

AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
serializer.removesKeysWithNullValues = YES;
op.responseSerializer = serializer;

Il y a un beau cocoapod appelé mincée https://github.com/hyperoslo/minced qui peutFaites quelque chose qui peut vous aider à gérer NULL à partir de la réponse JSON.Au lieu de null, il met la chaîne vide.

Si vous remplacez la nsjsonsorialisation par défaut avec SBJSON, cela résoudra votre problème.

SBJSON fait des objets nul au lieu du choix de "NULL" de NsjsonSerialization

Regardez les exigences des différents analyseurs JSON que vous pouvez utiliser. https://github.com/afnetworking/afnetworking#requirements

Vous pouvez personnaliser Afnetworking sur cette fonction.Définissez toute valeur par défaut sur des objets 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;

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top