简体   繁体   English

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

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

i have no experience with creating apps in swift but please bear with us.我没有在 swift 中创建应用程序的经验,但请耐心等待。 I would like to get data from public API in JSON format and create struct in swift, so i've found some tutorials but i' am facing issues.我想从 JSON 格式的公共 API 获取数据并在 swift 中创建结构,所以我找到了一些教程,但我遇到了问题。

I'm pretty sure that api returns json values, i've tested it via我很确定 api 返回 json 值,我已经通过测试

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

and i've got correct response.我得到了正确的回应。

But when i try to make objects from this response但是当我尝试从这个响应中制作对象时

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

It prints this error:它打印此错误:

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

All of my code with data structures:我所有的数据结构代码:

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

The API response is array of objects, its look like: response example So i want to display list of this object in my application. API 响应是对象数组,它看起来像:响应示例所以我想在我的应用程序中显示这个 object 的列表。

I would be really gratefull for any help如果有任何帮助,我将不胜感激

Change your "Station" structure so gegrLon and gegrLat are Strings:更改您的“站”结构,使 gegrLon 和 gegrLat 是字符串:

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

ie your error is saying that is Expected to decode Double but found a string/data instead.即你的错误是说Expected to decode Double but found a string/data instead.

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

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