Swift 4解析1 + n数量的json数字键 [英] Swift 4 parsing json numeric keys with 1+n amount

查看:72
本文介绍了Swift 4解析1 + n数量的json数字键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我仍在学习Swift 4中的这个Codable/Decodable JSON解析新功能.

I still learning this Codable/Decodable new in Swift 4 for JSON parsing.

我能够构建一个结构并抓住温度键,但是Pump和其他类似的项目是数字字符串,可能是1到n.将它们解析为数组或字典的最佳方法是什么.我会假设一个for循环吗?

I am able to build a struct and grab the temperature keys but the Pump and other items like it are numeric strings that could be 1 to n. What is the best way to parse those into an array or dictionary. I would assume a for loop?

 public struct ServerReponse: Codable {
    let temperature: Temperature
    let circuit: Circuit 
 }

public struct Circuit: Codable {
    let number: Int
    let numberStr: String
    let name: String
    let circuitFunction: String
    let status: Int
    let freeze: Int
    let delay: Int
    let friendlyName: String
    let light: Light?
}

public struct Light: Codable {
    let pump: Int
    let position: Int
    let colorStr: String
    let color: Int
    let colorSet: Int
    let colorSetStr: String
    let prevColor: Int
    let prevColorStr: String
    let colorSwimDelay: Int
    let mode: Int
    let modeStr: String
}

public struct Temperature : Codable {
    let poolTemp: Int
    let airTemp: Int
    let poolSetPoint: Int
    let heaterActive: Int
    }
...
let poolData = try? JSONDecoder().decode(ServerReponse.self, from: data)
print(poolData?.temperature)

我在解析下一节电路"时遇到问题,其中可能有1到许多数字键,然后电路本身位于每个数字键之下.

I am having issues parsing the next section "circuit" where there could be 1 to many number keys then the circuit struc itself below each one of those.

这是我正在使用的一些JSON ...

{
"temperature": {
    "poolTemp": 85,
    "spaTemp": 85,
    "airTemp": 75,
    "solarTemp": 0,
    "freeze": 0,
    "poolSetPoint": 82,
    "poolHeatMode": 1,
    "poolHeatModeStr": "Heater",
    "spaSetPoint": 80,
    "spaManualHeatMode": "Off",
    "spaHeatMode": 0,
    "spaHeatModeStr": "OFF",
    "heaterActive": 0
},
"circuit": {
        "1": {
            "number": 1,
            "numberStr": "circuit1",
            "name": "SPA",
            "circuitFunction": "Spa",
            "status": 0,
            "freeze": 0,
            "macro": 0,
            "delay": 0,
            "friendlyName": "SPA"
        },
        "2": {
            "number": 2,
            "numberStr": "circuit2",
            "name": "POOL LIGHT",
            "circuitFunction": "Intellibrite",
            "status": 0,
            "freeze": 0,
            "macro": 0,
            "delay": 0,
            "friendlyName": "POOL LIGHT",
            "light": {
                "position": 1,
                "colorStr": "off",
                "color": 0,
                "colorSet": 12,
                "colorSetStr": "Magenta",
                "prevColor": 0,
                "prevColorStr": "White",
                "colorSwimDelay": 5,
                "mode": 0,
                "modeStr": "Off"
            }
        },
        "3": {
            "number": 3,
            "numberStr": "circuit3",
            "name": "AUX 2",
            "circuitFunction": "Generic",
            "status": 1,
            "freeze": 0,
            "macro": 0,
            "delay": 0,
            "friendlyName": "OUTLET - PINE TREE"
        },
        "4": {
            "number": 4,
            "numberStr": "circuit4",
            "name": "AUX 3",
            "circuitFunction": "Generic",
            "status": 1,
            "freeze": 0,
            "macro": 0,
            "delay": 0,
            "friendlyName": "OUTLET - FOUNTAIN"
        },
        "5": {
            "number": 5,
            "numberStr": "circuit5",
            "name": "AUX 4",
            "circuitFunction": "Generic",
            "status": 0,
            "freeze": 0,
            "macro": 0,
            "delay": 0,
            "friendlyName": "AUX 4"
        },
        "6": {
            "number": 6,
            "numberStr": "circuit6",
            "name": "POOL",
            "circuitFunction": "Pool",
            "status": 1,
            "freeze": 1,
            "macro": 0,
            "delay": 0,
            "friendlyName": "POOL"
        },
      .... {more keys} ....
}

推荐答案

circuit的值是一个字典.

如果您需要通过数字快速访问,请将该对象解码为[String:Circuit]

If you need fast access by number decode the object as [String:Circuit]

public struct ServerReponse: Codable {
   let temperature: Temperature
   let circuit: [String:Circuit] 
}

如果数组更合适,请编写一个自定义初始化程序,该初始化程序还会将值映射到数组.

If an array is more suitable write a custom initializer which additionally maps the values to an array.

public struct ServerReponse: Codable {
    let temperature: Temperature
    let circuits: [Circuit]

    private enum CodingKeys: String, CodingKey { case temperature, circuits = "circuit"}

    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        temperature = try container.decode(Temperature.self, forKey: .temperature)
        let circuitData = try container.decode([String:Circuit].self, forKey: .circuits)
        circuits = Array(circuitData.values).sorted(by: {$0.number < $1.number})
    }
}

这篇关于Swift 4解析1 + n数量的json数字键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆