/ / Résoudre les nombres et les erreurs dans NSDictionary imbriqué - ios, objective-c, json

Résoudre les nombres et les erreurs dans NSDictionary imbriqué - ios, objective-c, json

Disons que j’ai chargé une chaîne JSON dans un NSDictionary contenant des nombres écrits sous forme de chaînes. Le NSDictionary résultant pourrait ressembler à ceci:

NSDictionary* example = @{
@"aNumber": @"1",
@"aFloat": @"2.9708",
@"aBool": @"true",
@"aNestedDict": @{
@"more": @"220",
@"evenMore": @"false",
@"anArray": @[
@"1",
@"2"
]
}
};

Je veux analyser le float, integer et bool("true", "false", "yes", "no" - insensible à la casse) dans leurs types de classe Objective-c respectifs. J'ai «regardé autour de moi, mais je ne peux trouver aucun exemple d'API intégrée pour le faire.

(Élargi depuis que les gens ne lisent pas la question)

Réponses:

1 pour la réponse № 1

Il n’existe pas une API pour le faire, mais vous pouvez créer une fonction d’aide pour le comprendre. L’API fournie par Apple est cependant une fonction d’aide sur NSString, c'est à dire.: .integerValue, .doubleValue, .boolValue. Cependant, non seulement cela est limité à NSString, mais il n’est pas non plus complet / intelligent.


0 pour la réponse № 2

Donc, si vous voulez analyser la chaîne dans une variable de type BOOL, vous pouvez faire quelque chose d'aussi simple que:

 - (NSNumber *)parseBool:(NSString *)value
{
if( [value caseInsensitiveCompare:@"yes"] == NSOrderedSame || [value caseInsensitiveCompare:@"true"] == NSOrderedSame )
{
return @YES;
} else if ([value caseInsensitiveCompare:@"no"] == NSOrderedSame || [value caseInsensitiveCompare:@"false"] == NSOrderedSame )
{
return @NO;
} else
{
return nil;
}
}

MODIFIER: Pour int et double, utilisez simplement:

NSString *string = @"1";
NSInteger intValue = string.integerValue;
double doubleValue = string.doubleValue;

0 pour la réponse № 3

JSON prend en charge les chaînes, les nombres avec et sans décimales, les valeurs booléennes, les valeurs nulles, les dictionnaires et les tableaux. Ainsi, toute personne souhaitant représenter des nombres et des valeurs booléennes en JSON peut le faire.

Toute personne produisant JSON devrait documenter ce qu’elleproduisent. Ainsi, s'ils insistent pour représenter une valeur booléenne sous forme de chaîne, ils doivent indiquer quelles chaînes possibles seront utilisées pour représenter true et false. Et puis, c’est juste une question de comparaison de chaînes.

Pour les nombres stockés sous forme de chaîne, vous pouvez utiliser integerValue ou doubleValue, ce qui convient parfaitement aux chaînes.