0

I need to convert a let JSON string to an object. Here are some code with an example but it doesn't work

   let json = "{ \"data\": [ { \"id\": \"201819S1911921391192161352\", \"unidadeCurricularId\": 18734, \"unidadeCurricularNome\": \"Algoritmos e Estruturas de Dados\", \"unidadeCurricularAbreviatura\": \"AED\", \"unidadeCurricularAtivo\": \"1\", \"unidadeCurricularIdMapSiges\": 9119213, \"anoCurricularId\": 3, \"anoCurricularNome\": \"2\", \"anoCurricularAtivo\": 1, \"anoCurricularIdMapSiges\": 2, \"periodoTempoId\": 5, \"periodoTempoNome\": \"1º Semestre\", \"periodoTempoAbreviatura\": \"1\", \"periodoTempoOrdem\": 1, \"periodoTempoAtivo\": 1, \"periodoTempoIdMapSiges\": \"S1\", \"numeroEstudante\": \"2140259\", \"idAnoLetivo\": 31, \"idUnidadeCurricular\": 18734, \"idEstadoInscricao\": 12, \"idAnoCurricular\": 3, \"numero_creditos\": 6 }, { \"id\": \"201819S1911921391192161352\", \"unidadeCurricularId\": 18735, \"unidadeCurricularNome\": \"Programação Avançada\", \"unidadeCurricularAbreviatura\": \"PA\", \"unidadeCurricularAtivo\": \"1\", \"unidadeCurricularIdMapSiges\": 9119213, \"anoCurricularId\": 3, \"anoCurricularNome\": \"2\", \"anoCurricularAtivo\": 1, \"anoCurricularIdMapSiges\": 2, \"periodoTempoId\": 5, \"periodoTempoNome\": \"1º Semestre\", \"periodoTempoAbreviatura\": \"1\", \"periodoTempoOrdem\": 1, \"periodoTempoAtivo\": 1, \"periodoTempoIdMapSiges\": \"S1\", \"numeroEstudante\": \"2140259\", \"idAnoLetivo\": 31, \"idUnidadeCurricular\": 18734, \"idEstadoInscricao\": 12, \"idAnoCurricular\": 3, \"numero_creditos\": 7 }, { \"id\": \"201819S1911921391192161352\", \"unidadeCurricularId\": 18735, \"unidadeCurricularNome\": \"Álgebra Linear\", \"unidadeCurricularAbreviatura\": \"AlgL\", \"unidadeCurricularAtivo\": \"1\", \"unidadeCurricularIdMapSiges\": 9119213, \"anoCurricularId\": 3, \"anoCurricularNome\": \"1\", \"anoCurricularAtivo\": 1, \"anoCurricularIdMapSiges\": 1, \"periodoTempoId\": 5, \"periodoTempoNome\": \"1º Semestre\", \"periodoTempoAbreviatura\": \"1\", \"periodoTempoOrdem\": 1, \"periodoTempoAtivo\": 1, \"periodoTempoIdMapSiges\": \"S1\", \"numeroEstudante\": \"2140259\", \"idAnoLetivo\": 31, \"idUnidadeCurricular\": 18734, \"idEstadoInscricao\": 12, \"idAnoCurricular\": 3, \"numero_creditos\": 7 } ] }";


    let data = json.data(using: .utf8)!
    do {
        if let jsonArray = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? [Dictionary<String,Any>]
        {
            let ucIdMapSiges = jsonArray["unidadeCurricularIdMapSiges"] as! Int
            let ucNome = jsonArray["unidadeCurricularNome"] as! String
        } else {
            print("bad json")
        }
    } catch let error as NSError {
        print(error)
    }
RajeshKumar R
  • 15,445
  • 2
  • 38
  • 70
JoãoPedro
  • 49
  • 1
  • 1
  • 9
  • Cannot subscript a value of type '[Dictionary]' with an index of type 'String' got this error – JoãoPedro May 14 '19 at 11:36
  • 3
    Possible duplicate of [Convert Json string to Json object in Swift 4](https://stackoverflow.com/questions/47281375/convert-json-string-to-json-object-in-swift-4) – dahiya_boy May 14 '19 at 11:42

2 Answers2

1

Your json root is a dictionary where data key is an array so try

do { 
        if let jsonArray = try JSONSerialization.jsonObject(with:Data(json.utf8), options :[]) as? Dictionary<String,Any> , let data = jsonArray["data"] as? [[String:Any]] {  
            data.forEach { 
               let ucIdMapSiges = $0["unidadeCurricularIdMapSiges"] as? Int
               let ucNome = $0["unidadeCurricularNome"] as? String

               print(ucIdMapSiges,ucNome)

            } 
        } 
    }
   catch {
        print(error)
   }

It's also better to

do {

     let res = try JSONDecoder().decode(Root.self, from:Data(json.utf8))
     print(res.data)
}
catch {
    print(error)
}



struct Root : Codable {
    let data:[Model]
}

struct Model : Codable {
    let unidadeCurricularIdMapSiges:Int
    let unidadeCurricularNome:String
}
Shehata Gamal
  • 98,760
  • 8
  • 65
  • 87
0

jsonArray is a Dictionary not Array. You need to get the array from dictionay by subscrpting with the key data

Try this

guard let data = json.data(using: .utf8) else {
    return
}
do {
    if let jsonDictionary = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? Dictionary<String,Any>
    {
        if let dataArray = jsonDictionary["data"] as? [[String:Any]] {
            for data in dataArray {
                if let ucIdMapSiges = data["unidadeCurricularIdMapSiges"] as? Int,
                    let ucNome = data["unidadeCurricularNome"] as? String {
                        print(ucIdMapSiges)
                        print(ucNome)
                }
            }
        }

    } else {
        print("bad json")
    }
} catch let error as NSError {
    print(error)
}
RajeshKumar R
  • 15,445
  • 2
  • 38
  • 70