Domanda

Stiamo usando Afnetworking nella nostra app mobile e un sacco di volte in cui avremo JSON torneremo che ha null per alcuni valori.

Mi sto stancando di fare quanto segue.

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

Tutto ciò che possiamo fare per rendere Afnetworking impostare automaticamente oggetti su nil o numeri a 0 se il valore è nullo nella risposta JSON?

È stato utile?

Soluzione

Non è davvero possibile, dal momento che il dizionario non può contenere nil come oggetto per una chiave.La chiave dovrebbe essere lasciata interamente per ottenere il comportamento che vorresti, il che sarebbe indesiderabile a modo suo.

Supponiamo che tu non abbia il controllo sui dati che hai ricevuto e non sapevi quali chiavi fossero presenti nel JSON.Se si desidera elencarli tutti, o visualizzarli in una tabella e i tasti per gli oggetti nullo sono stati lasciati fuori dal dizionario, vedresti un'elenco errato.

NSNull è il segnaposto "Niente" per le collezioni di cacao, ed è per questo che è usato in questo caso.

Potresti rendere il tuo digitatore un po 'più facile con una macro:

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

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

Altri suggerimenti

È possibile impostare il flag SetRemovesKeyyswithnullvalues su Sì in AfhttpsessionManager Risposta Serializzatore:

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

La risposta DV_ funziona alla grande per AFHTTSessionManager.Ma se stai usando AFHTTPRequestOperation al posto del gestore, prova questo:

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

C'è un bellissimo cacapod chiamato tritato https://github.com/hyperoslo/mincred che puòFai qualcosa che può aiutarti a gestire NULL dalla risposta JSON.Invece di null mette una stringa vuota.

Se si sostituisce la NSJSonserializzazione predefinita con SBJSON risolverà il tuo problema.

SBJSON semplifica gli oggetti invece della scelta di NSJsonSerialization di "NULL"

Guarda i requisiti per i diversi parser JSON che puoi utilizzare. https://github.com/afnetworking/afnetworking#requirements

È possibile utilizzare AFNetworking su queste funzioni.Imposta qualsiasi valore predefinito su oggetti che è 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;
.

}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top