2014-01-08 26 views
13

ich Mantle bin mit etwas JSON zu analysieren, die normalerweise wie folgt aussieht:Substituieren JSON Nullwerte in Mantle

"fields": { 

     "foobar": 41 
    } 

jedoch manchmal der Wert von foobar ist null:

"fields": { 

     "foobar": null 
    } 

Dies verursacht MTLValidateAndSetValue um eine Exception zu werfen, während versucht wird, einen Nullwert über Key-Value Coding zu setzen.

Was ich tun möchte, ist das Vorhandensein dieses Nullwerts erkennen und ersetzen Sie ihn mit -1.

Ich versuchte foobarJSONTransformer in meiner MTLModel Unterklasse überschreiben, wie folgt:

+ (NSValueTransformer *)foobarJSONTransformer { 
return [MTLValueTransformer transformerWithBlock:^id(id inObj) { 
    if (inObj == [NSNull null]) { 
     return [NSNumber numberWithInteger: -1]; 
    } else { 
     return inObj; 
    } 
}]; 

... und ich kann dieser Code sehen genannt wird, aber inObj ist nie gleich [NSNull null], damit die Substitution nicht geschieht und die Ausnahme wird immer noch von Mantle geworfen.

Was ist der richtige Weg, um diesen JSON-Null-Fall zu fangen und die Substitution zu tun?

Antwort

7

Ich hatte fälschlicherweise angenommen würde für einen Null-JSON-Wert generiert werden. Tatsächlich wird es zu einem nil Wert geparst.

So ist die Lösung inObj gegen nil, anstatt NSNull zu überprüfen:

+ (NSValueTransformer *)foobarJSONTransformer { 
return [MTLValueTransformer transformerWithBlock:^id(id inObj) { 
    if (inObj == nil) { 
     return [NSNumber numberWithInteger: -1]; 
    } else { 
     return inObj; 
    } 
}]; 

die Substitution wie erwartet funktioniert dann.

7

Wenn Sie als null empfangen haben, wird es als generiert. Aber wenn sie missed dieses Feld oder senden Sie es als empty, wird es als nil beim Parsen generiert. besser so können Sie unter Code verwenden

if (inObj == nil || inObj == [NSNull null]) 
1

ein Basismodell erstellen und MTLModel erben, und Schlag-Code außer Kraft setzen:

- (void)setNilValueForKey:(NSString *)key { 
    [self setValue:@0 forKey:key]; 
} 

, wenn Sie Eigenschaft ist oc Objekt, wird es null sofort und kann sein‘ t führt die Methode aus, kann aber ausgeführt werden, wenn die Eigenschaft int, bool oder float ist.