Estoy tratando de analizar el objeto de respuesta de una llamada a la API, pero tengo algunas dificultades.

Primero, analicé el JSON devuelto con lo siguiente:

let responseObject = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any]
if let result = responseObject["result"] {
  print(result)
}

Luego, cuando registro el resultado, lo siguiente es lo que obtengo:

{
    "_links" =     {
        next = "/api/3/action/datastore_search?limit=50&id=22f223e7-73f7-4842-935c-80a0ba5c3e5b&offset=50";
        start = "/api/3/action/datastore_search?limit=50&id=22f223e7-73f7-4842-935c-80a0ba5c3e5b";
    };
    fields =     (
                {
            id = "_id";
            type = int;
        },
                {
            id = package;
            info =             {
                label = "";
                notes = "Unique, normalized, name of dataset.
                "type_override" = "";
            };
            type = text;
        }
    )
}

Intenté analizarlo de nuevo:

let finalResult = (try? JSONSerialization.jsonObject(with: result)) as? [String: Any]

Pero me sale el siguiente error:

No hay coincidencias exactas en la llamada al método de clase 'jsonObject'

Actualizar

if let result = responseObject["result"] as? [String: Any] {
    if let finalResult = result["records"] {
        print(finalResult)
    }
}

Cuando registro esto, obtengo lo siguiente:

(
        {
        "_id" = 186;
        accessibility = 1;
        completeness = "0.6899999999999999";
        freshness = "0.5";
        grade = Silver;
        "grade_norm" = Silver;
        metadata = "0.84";
        package = "air-conditioned-and-cool-spaces-heat-relief-network";
        "recorded_at" = "2019-12-17T20:24:09";
        score = "0.78";
        "score_norm" = "0.76";
        usability = "0.86";
        version = "v0.1.0";
    },
        {
        "_id" = 187;
        accessibility = 1;
        completeness = 1;
        freshness = 0;
        grade = Bronze;
        "grade_norm" = Bronze;
        metadata = "0.25";
        package = "air-conditioned-public-places-cooling-centres";
        "recorded_at" = "2019-12-17T20:24:09";
        score = "0.54";
        "score_norm" = "0.31";
        usability = "0.85";
        version = "v0.1.0";
    },
)

Cuando intenté iterar esto:

for (key, value) in finalResult {
    print("key", key)
    print("value", value)
}

Aparece el siguiente error:

El patrón de tupla no puede coincidir con valores de tipo que no sea tupla

-1
Kevvv 23 ene. 2021 a las 05:10

1 respuesta

La mejor respuesta

Gracias a @OOPer, pude analizarlo como un diccionario:

if let result = responseObject["result"] as? [String: Any] {
    if let finalResult = result["records"] as? [[String: Any]] {
        finalResult.forEach { (catalogue) in
            if let package = catalogue["package"] as? String {
            }
        }
    }
}
1
Kevvv 23 ene. 2021 a las 17:46