Swift 5:JSON对象数组转为swift结构

问题描述 投票:-1回答:1

我没有在swift中创建应用程序的经验,但请耐心等待。我想从公共API中获取JSON格式的数据,并在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响应是对象数组,它的样子是:response example 所以我想在我的应用程序中显示这个对象的列表。

如果有任何帮助,我将非常感激。

ios json swift struct
1个回答
1
投票

改变你的 "站 "结构,使gegrLon和gegrLat是Strings。

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.

© www.soinside.com 2019 - 2024. All rights reserved.