JSONSerialization Tipo no válido en escritura JSON (SwiftValue)


¿Por qué el siguiente código me da el error:

Tipo no válido en escritura JSON (_SwiftValue).

El error se lanza en esta línea:

urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters)

Código completo:

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
    }
Author: Aaron Brager, 2016-09-16

5 answers

Si su problema aún no se resuelve con la respuesta dada aquí. Creo que uno de sus objetos dentro del parameters podría no ser una instancia de NSString, NSNumber, NSArray, NSDictionary, o NSNull. Como se indica en la documentación de la clase JSONSerialization:

Un objeto que se puede convertir a JSON debe tener las siguientes propiedades:

  1. El objeto de nivel superior es un NSArray o NSDictionary. Todos los objetos son instancias de NSString, NSNumber, NSArray, NSDictionary o NSNull.

  2. Todas las claves del diccionario son instancias de NSString. Los números no son NaN o infinito.

  3. Pueden aplicarse otras reglas. Llamar a isValidJSONObject (_:) o intentar una conversión son las formas definitivas de saber si un objeto determinado se puede convertir a datos JSON.

Por lo tanto, compruebe si alguno de los objetos en su objeto parameters no satisface las restricciones anteriores.

 24
Author: KrishnaCA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-07 19:00:59

Tuve este problema y fue porque una de mis cadenas era Opcional. Estaba tratando de serializar un valor como: "Opcional (\"valor de cadena\")"

En lugar de "string value"

 41
Author: ddiego,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-15 23:19:26

En caso de que alguien todavía tenga problemas y esté usando Enumeraciones, otra causa puede ser si está pasando un valor de enumeración y no es rawValue.

Ejemplo:

enum Status: String {
  case open
  case closed
}

En lugar de pasar la enumeración :

params = ["status": Status.open]

Pass

params = ["status": Status.open.rawValue]
 6
Author: gmogames,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-12 04:21:11

Si está utilizando SwiftyJSON para acceder a un objeto JSON, es importante utilizar dictionaryObject propiedad del JSON (en lugar de usar dictionaryValue, dictionary o nada en absoluto), porque obtendrá este error (o una variación del mismo) de lo contrario. Por ejemplo:

guard let jsonDict = json.dictionaryObject else {
    return
}

let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])
 0
Author: Tamás Sengel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-20 13:54:23

Debe convertir NSObject a NSDictory al principio

Pruebe esto para convertir a 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];
}

Entonces llama a esto:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:&err];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
 0
Author: 刘俊利,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-27 08:50:37