web-dev-qa-db-fra.com

JSONSerialization Type non valide en écriture JSON (_SwiftValue)

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
    }
31
jimijon

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:

  1. L'objet de niveau supérieur est un NSArray ou NSDictionary . Tous les objets sont des instances de NSString, NSNumber, NSArray, NSDictionary ou NSNull.

  2. Toutes les clés de dictionnaire sont des instances de NSString . Les nombres ne sont ni NaN ni l'infini.

  3. 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. 

29
KrishnaCA

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"

42
ddiego

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]
7
gmogames

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];
0
刘俊利

Si vous utilisez SwiftyJSON pour accéder à un objet JSON, il est important d'utiliser la propriétédictionaryObjectdu 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: [])
0
Tamás Sengel