【问题标题】:convert a JSON string to an JSON object on swift快速将 JSON 字符串转换为 JSON 对象
【发布时间】:2019-05-14 20:49:07
【问题描述】:

我需要将一个 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)
    }

【问题讨论】:

标签: ios json swift


【解决方案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
}

【讨论】:

  • try JSONSerialization. 更改为try? JSONSerialization. 只会增加调试难度。
  • @user28434 无论如何我知道它会起作用并且不希望它成为try! / try
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 2019-08-27
    • 2020-05-27
    • 1970-01-01
    • 2015-04-04
    • 2016-07-29
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    相关资源
    最近更新 更多