objective - alamofire swift 4 example
JSONSerialization Tipo no vĂ¡lido en escritura JSON(_SwiftValue) (5)
Debes convertir NSObject a NSDictory al principio
Intenta 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];
¿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
}
En caso de que alguien siga teniendo problemas y esté usando Enums, otra causa puede ser si está pasando un valor de Enum y no su valor en bruto.
Ejemplo:
enum Status: String {
case open
case closed
}
en lugar de pasar la enumeración :
params = ["status": Status.open]
pasar
params = ["status": Status.open.rawValue]
Si está usando SwiftyJSON para acceder a un objeto JSON, es importante usar la propiedad dictionaryObject
del JSON (en lugar de usar dictionaryValue
, dictionary
o nada), ya que de lo contrario obtendrá este error (o una variación de él). Por ejemplo:
guard let jsonDict = json.dictionaryObject else {
return
}
let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])
Si su problema aún no se resuelve con la respuesta dada aquí. Creo que uno de sus objetos dentro de los 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.
Otras reglas pueden aplicar. 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 de parameters
no cumple con las restricciones anteriores.
Tuve este problema y fue porque una de mis cadenas era opcional. Estaba intentando serializar un valor como: "Opcional (/" valor de cadena / ")"
En lugar de "valor de cadena"