繁体   English   中英

Swift 5: JSON object数组转swift结构体

[英]Swift 5: JSON object array to swift structure

我没有在 swift 中创建应用程序的经验,但请耐心等待。 我想从 JSON 格式的公共 API 获取数据并在 swift 中创建结构,所以我找到了一些教程,但我遇到了问题。

我很确定 api 返回 json 值,我已经通过测试

let dataAsString = String(data: data, encoding: .utf8)

我得到了正确的回应。

但是当我尝试从这个响应中制作对象时

let stations = try JSONDecoder().decode([Station].self, from: data)
                print(stations) // returns nil

它打印此错误:

//Error:  typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "gegrLat", intValue: nil)], debugDescription: "Expected to decode Double but found a string/data instead.", underlyingError: nil))

我所有的数据结构代码:

import UIKit

struct Commune: Codable{
    var communeName: String
    var districtName: String
    var proviceName: String
}

struct City: Codable{
    var id: Int
    var name: String
    var commune: Commune
}

struct Station: Codable {
    var id: Int
    var stationName: String
    var gegrLat: Double
    var gegrLon: Double
    var city: City
    var addressStreet: String?
}

class SearchViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let searchController = UISearchController(searchResultsController: nil)
        self.navigationItem.searchController = searchController

        let jsonUrlString = "http://api.gios.gov.pl/pjp-api/rest/station/findAll"
        guard let url = URL(string: jsonUrlString) else { return }

        URLSession.shared.dataTask(with: url){ (data, response, error) in
            guard let data = data else { return }
            //let dataAsString = String(data: data, encoding: .utf8)
            //print(dataAsString) //working fine, returns string with data

            //let json = try? JSONSerialization.jsonObject( with: data, options: .mutableContainers)
            //print(json) //also working fine, returns json

            do{
                let stations = try JSONDecoder().decode([Station].self, from: data)
                print(stations) // returns nil
            } catch let jsonErr {
                print("Error: ", jsonErr)
                //Error:  typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "gegrLat", intValue: nil)], debugDescription: "Expected to decode Double but found a string/data instead.", underlyingError: nil))
            }
        }.resume()
    }
}

API 响应是对象数组,它看起来像:响应示例所以我想在我的应用程序中显示这个 object 的列表。

如果有任何帮助,我将不胜感激

更改您的“站”结构,使 gegrLon 和 gegrLat 是字符串:

struct Station: Codable {
    var id: Int
    var stationName: String
    var gegrLat: String
    var gegrLon: String
    var city: City
    var addressStreet: String?
}

即你的错误是说Expected to decode Double but found a string/data instead.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM