首页 > 解决方案 > Swift 解析 JSON 数组给出零

问题描述

JSON 输出

{"inputs":{"lat":"29.93","lon":"-95.61","system_capacity":"30.30","azimuth":"180","tilt":"40","array_type":"1","module_type":"1","losses":"10"},"errors":[],"warnings":[],"version":"1.0.1","ssc_info":{"version":45,"build":"Linux 64 bit GNU/C++ Jul  7 2015 14:24:09"},"station_info":{"lat":29.93000030517578,"lon":-95.62000274658203,"elev":41.0,"tz":-6.0,"location":"None","city":"","state":"Texas","solar_resource_file":"W9562N2993.csv","distance":964},"outputs":{"ac_monthly":[3480.57373046875,3440.078369140625,3992.6513671875,3977.071533203125,4074.91357421875,3701.75,3897.655517578125,4248.00390625,4023.283447265625,4157.29931640625,3605.156005859375,3342.12890625],"poa_monthly":[139.791015625,140.18896484375,164.8218536376953,164.47149658203125,173.2971649169922,159.90576171875,169.84793090820312,186.20114135742188,173.14492797851562,176.2291717529297,148.28318786621094,136.62326049804688],"solrad_monthly":[4.509387493133545,5.006748676300049,5.316833972930908,5.4823832511901855,5.590230941772461,5.3301920890808105,5.4789652824401855,6.00648832321167,5.77149772644043,5.684812068939209,4.94277286529541,4.407201766967773],"dc_monthly":[3644.867919921875,3606.52001953125,4179.85107421875,4158.3193359375,4252.9140625,3865.03369140625,4069.092041015625,4432.62744140625,4198.369140625,4336.99609375,3767.055419921875,3490.091064453125],"ac_annual":45940.55859375,"solrad_annual":5.293959140777588,"capacity_factor":17.308107376098633}}{"inputs":{"lat":"29.93","lon":"-95.61","system_capacity":"30.30","azimuth":"180","tilt":"40","array_type":"1","module_type":"1","losses":"10"},"errors":[],"warnings":[],"version":"1.0.1","ssc_info":{"version":45,"build":"Linux 64 bit GNU/C++ Jul  7 2015 14:24:09"},"station_info":{"lat":29.93000030517578,"lon":-95.62000274658203,"elev":41.0,"tz":-6.0,"location":"None","city":"","state":"Texas","solar_resource_file":"W9562N2993.csv","distance":964},"outputs":{"ac_monthly":[3480.57373046875,3440.078369140625,3992.6513671875,3977.071533203125,4074.91357421875,3701.75,3897.655517578125,4248.00390625,4023.283447265625,4157.29931640625,3605.156005859375,3342.12890625],"poa_monthly":[139.791015625,140.18896484375,164.8218536376953,164.47149658203125,173.2971649169922,159.90576171875,169.84793090820312,186.20114135742188,173.14492797851562,176.2291717529297,148.28318786621094,136.62326049804688],"solrad_monthly":[4.509387493133545,5.006748676300049,5.316833972930908,5.4823832511901855,5.590230941772461,5.3301920890808105,5.4789652824401855,6.00648832321167,5.77149772644043,5.684812068939209,4.94277286529541,4.407201766967773],"dc_monthly":[3644.867919921875,3606.52001953125,4179.85107421875,4158.3193359375,4252.9140625,3865.03369140625,4069.092041015625,4432.62744140625,4198.369140625,4336.99609375,3767.055419921875,3490.091064453125],"ac_annual":45940.55859375,"solrad_annual":5.293959140777588,"capacity_factor":17.308107376098633}}

我正在使用以下课程。

class PVClass
{
    struct Top : Decodable {
        var Outputs: OutputsJSON?
        var Inputs: InputsJSON?
        enum CodingKeys : String, CodingKey {
            case Inputs = "inputs"
            case Outputs = "outputs"
        }
    }
    struct InputsJSON: Decodable {
        var lat: String?
        var lon: String?
        enum CodingKeys : String, CodingKey {
            case lat = "lat"
            case lon = "lon"
        }
    }

    struct OutputsJSON: Decodable {

        var dcMonthly: DC_MonthlyJSON?

        struct DC_MonthlyJSON: Decodable {
            var DC_Monthly: [String]?
            enum CodingKeys : String, CodingKey {
                case DC_Monthly = "dc_monthly"
            }
        }

    }
}

我访问 JSON。我可以打印“纬度”变量值,但 dc_monthly 数组给了我 0。我知道数组中有 12 个元素。即使我打印 DC_Monthly.count 值也是 0。如何访问数组元素?

let decoder = JSONDecoder()
                let jsonData = try decoder.decode(PVClass.Top.self, from: data!)
                print("Lat: ", jsonData.Inputs?.lat  ?? "0")
                print("dc_monthly: ", jsonData.Outputs?.dcMonthly?.DC_Monthly ?? "0")

标签: arraysjsonswift4

解决方案


您的类定义与 JSON 的结构不匹配。试试这个:

struct Top: Codable {
    let inputs: Inputs
    let outputs: Outputs
}

struct Inputs: Codable {
    let lat, lon: String
}

struct Outputs: Codable {
    let dcMonthly: [Double]

    enum CodingKeys: String, CodingKey {
        case dcMonthly = "dc_monthly"
    }
}

do {
    let top = try JSONDecoder().decode(Top.self, from: data)
    print(top.outputs.dcMonthly.count) // 12
} catch {
    print(error)
}

推荐阅读