在 swift 4 中获取 json 有啥问题?

Posted

技术标签:

【中文标题】在 swift 4 中获取 json 有啥问题?【英文标题】:what is wrong in the getting json in swift 4?在 swift 4 中获取 json 有什么问题? 【发布时间】:2017-10-07 18:04:26 【问题描述】:

我有一个天气预报 JSON,我在 Swift 4 中使用了新方法来序列化带有结构的 JSON,但问题是当我想打印 JSON 时我会收到这个:

typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [], debugDescription: "期望解码 Array 但找到了一个字典。",底层错误: nil))

这是我的 JSON 代码:

struct currently : Decodable 
let summary : String?
let temperature : Float?
let timezone : String

init(json : [String : Any]) 

    summary = json["summary"] as? String ?? ""
    temperature = json["temperature"] as? Float ?? -1
    timezone = json["timezone"] as? String ?? ""





这是获取 JSON 的代码:

let jsonURL =  "https://api.darksky.net/forecast/[code]/\(ViewController.latitude),\(ViewController.longitude)"

    guard let url = URL(string : jsonURL) else 
        return
    

    URLSession.shared.dataTask(with: url)  (data , response , error) in

        guard let data = data else return

        do 


            let currentlies =  try JSONDecoder().decode(currently.self , from : data)


            print(currentlies.timezone)
            print(currentlies.summary)
            print(currentlies.temperature)

        

        catch 

            print(error)
        
    .resume()

【问题讨论】:

错误很明显。您的 JSON 根是字典,但您将其视为数组。 那么如何在 swift 4 中使用字典? " 如何在 swift 4 中使用字典" 在 google 中搜索 这是个好主意 :))) 但请帮我写答案 将您的 currentlies 变量更改为字典。将调用的第一个参数 decode 更改为具有正确类型的字典。 【参考方案1】:

你可以这样使用:

struct Response : Decodable 
    let timezone : String
    let currently: Currently


struct Currently: Decodable 
    let summary: String
    let temperature: Double


let jsonURL =  "https://api.darksky.net/forecast/[code]/\(ViewController.latitude),\(ViewController.longitude)"

guard let url = URL(string : jsonURL) else 
    return


URLSession.shared.dataTask(with: url)  (data , response , error) in
   guard let data = data else return
    do 
        let currentlies =  try JSONDecoder().decode(Response.self , from : data)

        print(currentlies.timezone)
        print(currentlies.currently.summary)
        print(currentlies.currently.temperature)
     catch 
        print(error)
    
.resume()

【讨论】:

没错,这就是我想知道的,非常感谢

以上是关于在 swift 4 中获取 json 有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

在 [CLLocation] SWIFT 中保存 JSON 结果

如何在 swift 4 中使用 JSONDecoder 从嵌套 JSON 中获取数据?

Swift 4 从 JSON 中获取相关数据

使用 Swift 4 和 Xcode 9 获取 JSON 数据

如何使用 Alamofire,Swift 4 为 UICollectionView 获取 JSON 数据

Swift 4 Playground - 从 JSON 获取对象/结果