77 votes

JSONSerialization Type non valide dans l'écriture JSON (_SwiftValue)

Pourquoi le code suivant me donne-t-il l'erreur :

Type non valide dans l'écriture JSON (_SwiftValue).

L'erreur se produit 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
    }

1 votes

Si je comprends bien, votre "status" La clé contient code qui est du type Enum , cette erreur se produira. Remplacer le code par code.rawValue .

73voto

KrishnaCA Points 3979

Si votre problème n'est toujours pas résolu par la réponse donnée ici. Je pense que l'un de vos objets à l'intérieur du parameters peut ne pas être une instance de NSString , NSNumber , NSArray , NSDictionary ou NSNull . Comme indiqué dans la documentation de JSONSerialization classe :

Un objet qui peut être converti en JSON doit avoir les propriétés suivantes :

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

  2. Toutes les clés du dictionnaire sont ins Les nombres ne sont pas NaN ou infinis.

  3. D'autres règles peuvent s'appliquer. L'appel à isValidJSONObject(_ :) ou la tentative de conversion sont les moyens définitifs de savoir si un objet donné peut être converti en données JSON.

Veuillez donc vérifier si l'un des objets de votre parameters ne satisfait pas aux contraintes susmentionnées.

1 votes

Chaque valeur de clé est correcte dans mon cas, mais je reçois toujours cette erreur @KrishnaCA

0 votes

@Mansu.... veuillez vérifier si l'une de vos chaînes est optionnelle comme indiqué ci-dessous

0 votes

Comment convertir mon objet de classe codable en un objet JSON valide ?

55voto

ddiego Points 886

J'ai eu ce problème et c'est parce que l'une de mes cordes était optionnelle. J'essayais de sérialiser une valeur comme : "Optional(\N "valeur de la chaîne")"

Au lieu de "valeur de la chaîne"

1 votes

Moi aussi, j'ai juste dû faire en sorte que mes paramètres soient des chaînes de caractères au lieu de chaînes de caractères.

8 votes

Que faire lorsque vous devez avoir une valeur nulle dans votre JSON ? D'après le http://www.json.org/ Un JSON peut contenir des valeurs nulles.

0 votes

J'ai également résolu mon problème. Je pensais qu'il s'agissait des premières valeurs NSNull() avec Swift 3 mais cela ne provenait que d'une chaîne de caractères optionnelle.

24voto

gmogames Points 571

Au cas où quelqu'un aurait encore des problèmes et utiliserait des Enums, une autre cause pourrait être de passer une valeur d'Enum et non sa valeur brute.

Exemple :

enum Status: String {
  case open
  case closed
}

au lieu de passer l'énumération :

params = ["status": Status.open]

passer

params = ["status": Status.open.rawValue]

3 votes

C'est exactement ce qui s'est passé ! Merci :)

3voto

Tamás Sengel Points 25414

Si vous utilisez SwiftyJSON pour accéder à un objet JSON, il est important d'utiliser la méthode dictionaryObject de la propriété JSON (au lieu d'utiliser la propriété dictionaryValue , dictionary ou rien du tout), car vous obtiendrez cette erreur (ou une variante de celle-ci) dans le cas contraire. Par exemple :

guard let jsonDict = json.dictionaryObject else {
    return
}

let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])

1 votes

Vous êtes une légende. Sachez que.

0voto

刘俊利 Points 76

Vous devez convertir NSObject a NSDictionary dans un premier temps

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];
}

Appelez ensuite ceci :

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:&err];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X