Pourquoi le code suivant me donne-t-il l'erreur:
Type non valide en écriture JSON (_SwiftValue).
L'erreur est renvoyé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
}
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 dans parameters
pourrait ne pas être une instance de NSString
, NSNumber
, NSArray
, NSDictionary
ou NSNull
. Comme indiqué dans la documentation de la classe JSONSerialization
:
Un objet pouvant ê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 ou NSNull.
Toutes les clés de dictionnaire sont des instances de NSString . Les nombres ne sont ni NaN ni l'infini.
D'autres règles peuvent s'appliquer. Le fait d'appeler isValidJSONObject (_ :) ou de tenter une conversion est le meilleur moyen de savoir si un objet donné peut être converti en données JSON.
Alors, veuillez vérifier si l'un des objets de votre objet parameters
ne satisfait pas les contraintes ci-dessus.
J'ai eu ce problème et c'est parce que l'une de mes chaînes était facultative. Il essayait de sérialiser une valeur comme:
Au lieu de "valeur de chaîne"
Juste au cas où quelqu'un aurait encore des problèmes et utiliserait Enums, une autre cause pourrait être si vous transmettez une valeur Enum et non pas rawValue.
Exemple:
enum Status: String {
case open
case closed
}
au lieu de passer l'énum :
params = ["status": Status.open]
passer
params = ["status": Status.open.rawValue]
Vous devriez d'abord convertir NSObject
en NSDictionary
Essayez ceci pour convertir en NSDictionary
.
#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];
}
Ensuite, appelez ceci:
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:&err];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
Si vous utilisez SwiftyJSON pour accéder à un objet JSON, il est important d'utiliser la propriétédictionaryObject
du JSON (au lieu d'utiliser dictionaryValue
, dictionary
ou rien du tout), car vous obtiendrez cette erreur ( ou une variante de celui-ci) autrement. Par exemple:
guard let jsonDict = json.dictionaryObject else {
return
}
let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])