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
}
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:
El objeto de nivel superior es un NSArray o NSDictionary. Todos los objetos son instancias de NSString, NSNumber, NSArray, NSDictionary o NSNull.
Todas las claves del diccionario son instancias de NSString. Los números no son NaN o infinito.
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.
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"
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]
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: [])
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];
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