Después de recibir una carga útil JSON
de una solicitud web, necesito analizar los datos en variables en una subclase NSObject
.
Mis variables se declaran en el objeto:
var name:String?
var email:String?
var aboutMe:String?
Luego empiezo a analizar todos los datos posibles que JSON
puede devolver:
if let name = json["Name"] as? String
{
self.name = name
}
if let email = json["Email"] as? String
{
self.email = email
}
if let aboutMe = json["AboutMe"] as? String
{
self.aboutMe = aboutMe
}
Esto se está volviendo bastante largo ya que tenemos muchos datos.
Quería acortarlo usando un Dictionary
que contiene la tecla JSON
y el variable
así:
let varMap:[String:Any?] = [
"Name": self.name,
"Email": self.email,
"AboutMe": self.aboutMe
]
Luego iterando sobre ellas de esta manera:
for (key, var variable) in varMap
{
if let string = json[key]
{
variable = string
}
}
El problema aquí es que Dictionary
copia el valor de la variable y no un puntero, por lo que establecerlo en un nuevo valor no tiene ningún efecto en las variables del objeto general.
¿Hay alguna manera de lograr lo que estoy intentando? Si no, ¿qué otro patrón sería una mejor manera de hacer esto en lugar de tener toneladas de declaraciones if
?
2 respuestas
Para el análisis JSON , simplemente puede usar los tipos Codable
.
Supongamos que su JSON se ve así,
{
"name": "Alex",
"email": "alex@gmail.com",
"about_Me": "My name is Alex"
}
Modelos:
class Root: Decodable {
let name: String?
let email: String?
let aboutMe: String?
enum CodingKeys: String, CodingKey {
case name, email
case aboutMe = "about_Me"
}
}
Analizar el JSON data
así,
do {
let response = try JSONDecoder().decode(Root.self, from: data)
print(response) //use response here...
} catch {
print(error)
}
Puede usar la función updateValue para eso, encuentra la propiedad y la cambia.
if let oldValue = varMap.updateValue(self.name, forKey: "Name") {
print("The old value of \(oldValue) was replaced with a new one.")
}
Entonces, para la iteración es;
for (key, var variable) in varMap
{
varMap.updateValue(string, forKey: key )
//if let string = json[key]
//{
// variable = string
//}
}
Después de actualizar el diccionario, puede llamar a esa parte;
if let name = json["Name"] as? String
{
self.name = name
}
if let email = json["Email"] as? String
{
self.email = email
}
if let aboutMe = json["AboutMe"] as? String
{
self.aboutMe = aboutMe
}
Creo que parte de una función, si no es así, puede refactorizarla.
https://developer.apple.com/documentation/swift/dictionary/3127179-updatevalue
Preguntas relacionadas
Nuevas preguntas
json
JSON (JavaScript Object Notation) es un formato de intercambio de datos serializable destinado a ser legible por máquinas y humanos. No utilice esta etiqueta para objetos JavaScript nativos o literales de objetos JavaScript. Antes de hacer una pregunta, valide su JSON con un validador JSON como JSONLint (https://jsonlint.com).