Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将具有变量名的JSON转换为swift对象?_Ios_Json_Swift_Macos - Fatal编程技术网

Ios 如何将具有变量名的JSON转换为swift对象?

Ios 如何将具有变量名的JSON转换为swift对象?,ios,json,swift,macos,Ios,Json,Swift,Macos,我正在处理一个带有API的项目,API给我一个JSON对象,其中包含一些变量中的数据。但用于提供数据的变量的名称每天都在变化。比如今天的名字是285,明天是286。如何将其转换为Swift对象?我已经写了一些代码,所以这里是: 获取数据部分: func getData(){ let semaphore = DispatchSemaphore.init(value: 0) let url = URL(string: URL_STRING)! var

我正在处理一个带有API的项目,API给我一个JSON对象,其中包含一些变量中的数据。但用于提供数据的变量的名称每天都在变化。比如今天的名字是285,明天是286。如何将其转换为Swift对象?我已经写了一些代码,所以这里是:

获取数据部分:

func getData(){
        let semaphore = DispatchSemaphore.init(value: 0)

        let url = URL(string: URL_STRING)!
        var request = URLRequest(url: url)

        request.httpMethod = "GET"


        session.dataTask(with: request) { (dat, res, err) in

            print("Anfrage gestellt")

            guard let data = dat else {
                print("no Data")
                return
            }

            guard let resp = res else {
                print("No Response ")
                return
            }

            if let error = err {
                print("Error: \(error)")
                return
            }



            do{
                let decodedData = try self.decoder.decode(Report.self, from: data)
                print(decodedData)


            } catch {
                print("Data decode failed \(error)")
            }

            semaphore.signal()
        }.resume()
        semaphore.wait()

        return
    }
将在其中进行转换的对象

class Report: Codable{

    var keys: [String] = []
    var latest: String?
    let s: S

    init(keys: [String], s: S){
        self.keys = keys
        self.s = s
        latest = keys[keys.count - 1]
    }

    enum CodingKeys: String, CodingKey{
        case s = "286"
    }

}
JSON对象:

{
  "285": {
    "AT": {
      "av": -72.1,
      "ct": 113986,
      "mn": -100.813,
      "mx": -27.115
    },
    "First_UTC": "2019-09-15T01:13:15Z",
    "HWS": {
      "av": 4.347,
      "ct": 54297,
      "mn": 0.20600000000000002,
      "mx": 21.272
    },
    "Last_UTC": "2019-09-16T01:52:49Z",
    "PRE": {
      "av": 742.003,
      "ct": 89613,
      "mn": 723.2129,
      "mx": 757.8722
    },
    "Season": "spring",
    "WD": {
      "1": {
        "compass_degrees": 22.5,
        "compass_point": "NNE",
        "compass_right": 0.382683432365,
        "compass_up": 0.923879532511,
        "ct": 1
      },
      "10": {
        "compass_degrees": 225.0,
        "compass_point": "SW",
        "compass_right": -0.707106781187,
        "compass_up": -0.707106781187,
        "ct": 6973
      },
      "11": {
        "compass_degrees": 247.5,
        "compass_point": "WSW",
        "compass_right": -0.923879532511,
        "compass_up": -0.382683432365,
        "ct": 3196
      },
      "12": {
        "compass_degrees": 270.0,
        "compass_point": "W",
        "compass_right": -1.0,
        "compass_up": -0.0,
        "ct": 3066
      },
      "3": {
        "compass_degrees": 67.5,
        "compass_point": "ENE",
        "compass_right": 0.923879532511,
        "compass_up": 0.382683432365,
        "ct": 131
      },
      "5": {
        "compass_degrees": 112.5,
        "compass_point": "ESE",
        "compass_right": 0.923879532511,
        "compass_up": -0.382683432365,
        "ct": 680
      },
      "6": {
        "compass_degrees": 135.0,
        "compass_point": "SE",
        "compass_right": 0.707106781187,
        "compass_up": -0.707106781187,
        "ct": 9405
      },
      "7": {
        "compass_degrees": 157.5,
        "compass_point": "SSE",
        "compass_right": 0.382683432365,
        "compass_up": -0.923879532511,
        "ct": 8813
      },
      "8": {
        "compass_degrees": 180.0,
        "compass_point": "S",
        "compass_right": 0.0,
        "compass_up": -1.0,
        "ct": 8231
      },
      "9": {
        "compass_degrees": 202.5,
        "compass_point": "SSW",
        "compass_right": -0.382683432365,
        "compass_up": -0.923879532511,
        "ct": 13801
      },
      "most_common": {
        "compass_degrees": 202.5,
        "compass_point": "SSW",
        "compass_right": -0.382683432365,
        "compass_up": -0.923879532511,
        "ct": 13801
      }
    }
  },
    "sol_keys": [
    "285"
  ]
}
谢谢你的帮助


Eric

如前所述,您可以将其解码为字典,首先为要解码的数据定义一个结构

struct ReportData: Decodable {
    let at: SomeData
    let firstUTC: Date
    let hws: SomeData
    //...
}
然后将其解码为

let decodedData = try self.decoder.decode([String:ReportData].self, from: data)
要在字典中找到正确的键,您可以使用sol_键

if let keys = decodedData ["sol_keys"] {
    for key in keys {
        let report = decodeData[key]
        //...

显示JSON。不要使用信号量。在这种情况下,你使用
字典
@user28434,这是什么意思?创建一个以“286”为键,以“s”为数据的字典?我想这不会解决我的问题,因为仍然需要硬编码中的“286”:/What?如何“将密钥硬编码到
字典中”
?您只需将
JSON
解析为
[String:][/code>“sol_keys”似乎包含要使用的密钥非常感谢!!您是一位英雄!