通过SWIFT中的网址进行JSON解码

时间:2018-08-17 20:58:48

标签: json swift url

我正在尝试从URL解码以下JSON:

{
"date":"2018-08-17",
"data":[
       {"id":"IDD","rate":"1.1","name":"My test ID"},
       {"id":"IDX","rate":"101.12","name":"Another test ID"}
       ]
}

我的快捷文件如下:

struct Container: Codable {
let date: String
let data: [MyData]
}

struct MyData: Codable {
let id: String
let rate: Double
let name: String
}

// This outputs the required json string    
if let url = URL(string: "https://www.xxx.php") {

do {
    let contents = try Data(contentsOf: url)

    do {
        let decoder = JSONDecoder()
        let jData: Container = try decoder.decode(Container.self, from: contents)

        print("The data presented is from \(jData.date)")

        for id in jData.data {
            // Here I want to get an array of the json data
            print(id.id)
        }

    } catch {
        print(error.localizedDescription)
    }

} catch {
    print(error.localizedDescription)
}

}

我的代码抛出错误:由于格式不正确,无法读取数据。

我在做什么错?您可能还对一般如何改进我的代码有建议吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

问题是这一行:

let rate: Double

将其更改为:

let rate: String

答案 1 :(得分:0)

我相信问题在于,数据类中的rate是Double,而JSON中的rate是字符串。数据类中的两种更改率都可以:

let rate: String

或将JSON更改为以数字代替数字:

{
"date":"2018-08-17",
"data":[
       {"id":"IDD","rate":1.1,"name":"My test ID"},
       {"id":"IDX","rate":101.12,"name":"Another test ID"}
       ]
}

edit:对不起,我刚刚注意到已经有一个答案,基本上是说同样的话。 :)

答案 2 :(得分:0)

您应该使用URLSessionTask下载异步数据。否则,该应用将无响应且滞后。

第二,您应该将rate更改为String或在自定义init方法中提供自定义解码器以将其强制转换为double