快速将JSON字符串转换为JSON对象

时间:2019-05-14 11:35:59

标签: ios json swift

我需要将let JSON字符串转换为对象。 这是一些带有示例的代码,但是不起作用

   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)
    }

3 个答案:

答案 0 :(得分:1)

您的json根是字典,其中data键是数组,请尝试

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)
   }

最好也

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
}

答案 1 :(得分:0)

jsonArrayDictionary而不是Array。您需要通过使用键data

进行预订来从字典中获取数组。

尝试一下

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)
}

答案 2 :(得分:-1)

不工作

import SwiftyJSON

let jsonData = json.stringValue.data(using: String.Encoding.utf8, allowLossyConversion: false)
let   jsonObject = try! JSON(data: jsonData!)

很抱歉,我检查不正确,因为我用手机复制了代码。我在xCode中检查了一下,此代码有效

工作:

 import SwiftyJSON

 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 jsonData = json.data(using: String.Encoding.utf8, allowLossyConversion: false)
    let   jsonObject = try! JSON(data: jsonData!)

    print(jsonObject["data"])

输出:

[   {     “ unidadeCurricularIdMapSiges”:9119213,     “ idAnoCurricular”:3,     “ anoCurricularAtivo”:1     “ unidadeCurricularId”:18734,     “ periodoTempoOrdem”:1     “ idAnoLetivo”:31,     “ idEstadoInscricao”:12     “ periodoTempoAtivo”:1,     “ id”:“ 201819S1911921391192161352”,     “ idUnidadeCurricular”:18734,     “ unidadeCurricularAbreviatura”:“ AED”,     “ anoCurricularId”:3,     “ periodoTempoIdMapSiges”:“ S1”,     “ numeroEstudante”:“ 2140259”,     “ periodoTempoAbreviatura”:“ 1”,     “ anoCurricularIdMapSiges”:2     “ unidadeCurricularAtivo”:“ 1”,     “ numero_creditos”:6     “ unidadeCurricularNome”:“ Algoritmos e Estruturas de Dados”,     “ periodoTempoNome”:“1ºSemestre”,     “ periodoTempoId”:5     “ anoCurricularNome”:“ 2”   },   {     “ unidadeCurricularIdMapSiges”:9119213,     “ idAnoCurricular”:3,     “ anoCurricularAtivo”:1     “ unidadeCurricularId”:18735,     “ periodoTempoOrdem”:1     “ idAnoLetivo”:31,     “ idEstadoInscricao”:12     “ periodoTempoAtivo”:1,     “ id”:“ 201819S1911921391192161352”,     “ idUnidadeCurricular”:18734,     “ unidadeCurricularAbreviatura”:“ PA”,     “ anoCurricularId”:3,     “ periodoTempoIdMapSiges”:“ S1”,     “ numeroEstudante”:“ 2140259”,     “ periodoTempoAbreviatura”:“ 1”,     “ anoCurricularIdMapSiges”:2     “ unidadeCurricularAtivo”:“ 1”,     “ numero_creditos”:7     “ unidadeCurricularNome”:“ProgramaçãoAvançada”,     “ periodoTempoNome”:“1ºSemestre”,     “ periodoTempoId”:5     “ anoCurricularNome”:“ 2”   },   {     “ unidadeCurricularIdMapSiges”:9119213,     “ idAnoCurricular”:3,     “ anoCurricularAtivo”:1     “ unidadeCurricularId”:18735,     “ periodoTempoOrdem”:1     “ idAnoLetivo”:31,     “ idEstadoInscricao”:12     “ periodoTempoAtivo”:1,     “ id”:“ 201819S1911921391192161352”,     “ idUnidadeCurricular”:18734,     “ unidadeCurricularAbreviatura”:“ AlgL”,     “ anoCurricularId”:3,     “ periodoTempoIdMapSiges”:“ S1”,     “ numeroEstudante”:“ 2140259”,     “ periodoTempoAbreviatura”:“ 1”,     “ anoCurricularIdMapSiges”:1     “ unidadeCurricularAtivo”:“ 1”,     “ numero_creditos”:7     “ unidadeCurricularNome”:“ÁlgebraLinear”,     “ periodoTempoNome”:“1ºSemestre”,     “ periodoTempoId”:5     “ anoCurricularNome”:“ 1”   } ]