Jsonserialization invalides type in JSON write (SwiftValue)
Pourquoi le code suivant me donner le message d'erreur:
type invalide dans JSON write (_SwiftValue).
L'erreur est levée sur cette ligne:
urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters)
Code complet:
let parameters:Parameters = ["resource":[
[
"appUserCode":uuidString,
"productNFCode": self.nfCode!,
"status":code,
"applicationKey":appDelegate.api_key
]
]
]
do {
urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters)
} catch {
// No-op
}
5 réponses
Si votre problème n'est toujours pas résolu par la réponse donnée ici. Je crois que l'un de vos objets à l'intérieur de l' parameters
peut ne pas être une instance de NSString
,NSNumber
, NSArray
,NSDictionary
, ou NSNull
. Comme indiqué dans la documentation de JSONSerialization
catégorie:
Un objet qui peut être converti en JSON doit avoir les propriétés suivantes:
l'objet de niveau supérieur est un NSArray ou NSDictionary. Tous les objets sont des instances de NSString, NSNumber, NSArray, NSDictionary, or NSNull.
toutes les clés du dictionnaire sont des instances de NSString. Les nombres ne sont pas NaN ou l'infini.
d'Autres règles peuvent s'appliquer. Appeler isValidJSONObject (_:) ou tenter une conversion sont les moyens définitifs de dire si un objet donné peut être converti en données JSON.
oui, veuillez vérifier si l'un des objets de votre parameters
l'objet ne répond pas aux critères ci-dessus contraintes.
j'ai eu ce problème et c'était parce qu'une de mes cordes était optionnelle. Il essayait de sérialiser une valeur comme: "En option(\"chaîne de valeur\")"
au lieu de"string value"
juste au cas où quelqu'un a encore des problèmes et utilise des Énums, une autre cause peut être si vous passez une valeur Enum et non c'est la valeur brute.
Exemple:
enum Status: String {
case open
case closed
}
au lieu de passer l'enum:
params = ["status": Status.open]
pass
params = ["status": Status.open.rawValue]
Si vous utilisez SwiftyJSON pour accéder à un objet JSON, il est important d'utiliser le dictionaryObject
propriété du JSON (au lieu d'utiliser dictionaryValue
, dictionary
ou rien du tout), parce que vous obtiendrez cette erreur (ou une variante de celle-ci). Par exemple:
guard let jsonDict = json.dictionaryObject else {
return
}
let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])
vous devriez convertir NSObject en NSDictory d'abord
essayez ceci pour convertir en NSDictory.
#import <objc/runtime.h>
//Add this utility method in your class.
+ (NSDictionary *)dictionaryWithPropertiesOfObject:(id)obj {
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
unsigned count;
objc_property_t *properties = class_copyPropertyList([obj class], &count);
for (int i = 0; i < count; i++) {
NSString *key = [NSString stringWithUTF8String:property_getName(properties[i])];
[dict setObject:[obj valueForKey:key] ? [obj valueForKey:key] : @"" forKey:key];
}
free(properties);
return [NSDictionary dictionaryWithDictionary:dict];
}
Puis composez ceci:
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:&err];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];