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
    }
28
demandé sur Aaron Brager 2016-09-16 01:45:33

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:

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

  2. toutes les clés du dictionnaire sont des instances de NSString. Les nombres ne sont pas NaN ou l'infini.

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

24
répondu KrishnaCA 2017-03-07 19:00:59

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"

41
répondu ddiego 2016-09-15 23:19:26

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]
6
répondu gmogames 2017-07-12 04:21:11

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: [])
0
répondu Tamás Sengel 2018-02-20 13:54:23

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];
0
répondu 刘俊利 2018-06-27 08:50:37