繁体   English   中英

Swift 4.2-解码相同密钥不同类型的JSON

[英]Swift 4.2 - Decode JSON Where Same Key Is Different Type

我正在使用以下模型解码对象

struct ACDeviceLastData {
    var DA: ACDeviceLastDataBody = ACDeviceLastDataBody()
}

struct ACDeviceLastDataBody {
    var amOn: Bool = false
    var enabledZones: [Int] = []
    var fanSpeed: Int = 0
    var mode: Int = 0
    var tempTarget: Float = 0.00
}

extension ACDeviceLastData: Decodable {
        init(from decoder: Decoder) throws {
            //Create Container
            let container = try decoder.container(keyedBy: ACDeviceCodingKeys.self)

        //Decode Data
        DA = try container.decodeIfPresent(ACDeviceLastDataBody.self, forKey: .DA) ?? ACDeviceLastDataBody()
    }
}

extension ACDeviceLastDataBody: Decodable {
    init(from decoder: Decoder) throws {
        //Create Container
        let container = try decoder.container(keyedBy: ACDeviceCodingKeys.self)

        //Decode Data
        amOn = try container.decodeIfPresent(Bool.self, forKey: .amOn) ?? false
        enabledZones = try container.decodeIfPresent([Int].self, forKey: .enabledZones) ?? []
        fanSpeed = try container.decodeIfPresent(Int.self, forKey: .fanSpeed) ?? 0
        mode = try container.decodeIfPresent(Int.self, forKey: .mode) ?? 0
        tempTarget = try container.decodeIfPresent(Float.self, forKey: .tempTarget) ?? 0.00
    }
}

问题在于DA的值并不总是相同的类型。 它有时可以采用整数数组的格式,有时也可以采用ACDevieLastDataBody的格式。 我尝试做一次尝试捕获,但无法完全弄清楚如何使它正常工作(即使这是正确的做法)

我的问题是,在整数数组的情况下,如何在不引发解码器的情况下解码这些图像。 非常感谢任何帮助。 先感谢您。

首先,您必须选择一种存储数据的方式。 为简单起见,让我们将Int数组存储为单独的属性:

struct ACDeviceLastData {
   var DA: ACDeviceLastDataBody = ACDeviceLastDataBody()
   var DAasInts: [Int] = []
}

extension ACDeviceLastData: Decodable {
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: ACDeviceCodingKeys.self)

        if let ints: [Int] = try? (container.decodeIfPresent([Int].self, forKey: .DA) ?? []) {
            // will pass here when `DA` is null or an array of ints
            DA = ACDeviceLastDataBody()
            DAasInts = ints
        } else {
            // null is already handled above
            DA = try container.decode(ACDeviceLastDataBody.self, forKey: .DA)
            DAasInts = []
        }
    }
}

您可能希望以不同的方式表示数据,例如,从整数数组创建ACDeviceLastDataBody

您需要在init(from decoder: Decoder)安排类型init(from decoder: Decoder)

这是一个简单的转换,请注意类型可能不完全相同,因此兼容性由您自己负责,由您负担。

我看不到JSON,但从JSON到代码的操作非常容易,因为JSON类型在原子级别始终很简单。

希望对您有帮助...

你今天过得愉快!

暂无
暂无

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

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