Ios 在swift上将JSON字符串转换为JSON对象

Ios 在swift上将JSON字符串转换为JSON对象,ios,json,swift,Ios,Json,Swift,我需要将let JSON字符串转换为对象。 下面是一些带有示例的代码,但它不起作用 let json = "{ \"data\": [ { \"id\": \"201819S1911921391192161352\", \"unidadeCurricularId\": 18734, \"unidadeCurricularNome\": \"Algoritmos e Estruturas de Dados\", \"unidadeCurricularAbreviatura\": \"AED\

我需要将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)
    }
let json=“{\'data\”:[{\'id\”:“201819S1911921391192161352\”,“unidadeCurricularId\”:18734,““unidadeCurricularNome\”:“Algoritmos e Estruturas de Dados\”,“unidadecurricularbreviatura\”:“AED\”,“unidadeCurricularAtivo\”:“1\”,“unidadeCurricularIdMapSiges\”:9119213,“,“anoducular\”:3,“:“anoducular\”,“anome\”,“anome\”,“anome\”非课程性活动:1,“非课程性事件”:2,“周期性事件”:5,“周期性事件”:1:Semestre,“周期性事件”:1,“周期性事件”:1,“周期性事件”:1,“周期性事件”:1,“周期性事件”:1,“周期性事件”:1,“周期性事件”:“S1”;“数值研究者”:“2140259”;“Idonoletivo”;“Idonoletivo”;“Idonoletivo”;“IdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdIdidEstadoInscricao\:12,“idAnoCurricular\”:3,“numeroçu creditos\”:6},{“id\”:“201819S1911921391192161352\,“unidadeCurricularId\”:18735,“Unidadecurricular\”:“Programaço Avançada\”,“Unidadecurricularabrevariatura\”:“PA\”,“unidadeCurricularAtivo\”:“1\,“Unidadecurricular\”:“Unidadecurricular\”:19213非课程名称:idUnidadeCurricular\:18734,\“idEstadoInscricao\”:12,\“Idunocurricular\”:3,\“数字信用”:7,{“id\:”201819S1911921391192161352\,“unidadeCurricularId\”:18735,\“unidadeCurricularNome\:“线性代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数代数\“:9119213,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\“idAnoLetivo\”:31,“idUnidadeCurricular\”:18734,“idEstadoInscricao\”:12,“idAnoCurricular\”:3,“numero\u creditos\”:7}];
让data=json.data(使用:.utf8)!
做{
如果让jsonArray=try JSONSerialization.jsonObject(带有:data,options:.allowFragments)作为?[Dictionary]
{
设ucIdMapSiges=jsonArray[“unidadeCurricularIdMapSiges”]为!Int
让ucNome=jsonArray[“unidadeCurricularNome”]作为!字符串
}否则{
打印(“坏json”)
}
}将let错误捕获为NSError{
打印(错误)
}

jsonArray
是一个
字典
而不是
数组
。您需要通过使用键
data
subscrpting从字典中获取数组

试试这个

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)
}
guard let data=json.data(使用:.utf8)else{
回来
}
做{
如果让jsonDictionary=尝试将JSONSerialization.jsonObject(使用:data,options:.allowFragments)作为字典
{
如果让dataArray=jsonDictionary[“数据”]作为?[[String:Any]]{
用于数据阵列中的数据{
如果将ucIdMapSiges=data[“unidadeCurricularIdMapSiges”]设为?Int,
将ucNome=data[“unidadeCurricularNome”]设为?字符串{
打印(ucIdMapSiges)
印刷品(ucNome)
}
}
}
}否则{
打印(“坏json”)
}
}将let错误捕获为NSError{
打印(错误)
}

您的json根目录是一个字典,其中
数据
键是一个数组,请尝试

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

无法用“String”类型的索引为“[Dictionary]”类型的值下标,出现此错误可能是从
try JSONSerialization.
try的更改重复?JSONSerialization.
只会使调试变得更困难。@user28434无论如何,我知道它会工作的,我不希望它是
尝试/
试试
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
}