解码 Json Swift 4 可编码类型 任意

Decode Json Swift 4 Codable Type Any

大家好,我遇到了解码问题。我有一个 Json 看起来像这样:

"data": [
            [
                DoubleValue,
                DoubleValue,
                DoubleValue,
                DoubleValue,
                DoubleValue,
                "",
                ""
            ],
            [
                DoubleValue,
                DoubleValue,
                DoubleValue,
                DoubleValue,
                DoubleValue,
                "",
                ""
            ],
            [
                DoubleValue,
                DoubleValue,
                DoubleValue,
                DoubleValue,
                DoubleValue,
                "",
                ""
            ]
]

所以我的建议是创建一个包含 [[Any]] 的 let 数据,但这不适用于 Codable 并且 [[Double]] 不可用,因为如果该值为空 api向我发送空字符串,我收到类型不匹配错误。

有人建议如何解决这个问题吗?

我当前的 Codable 看起来像

public struct JsonData: Codable {

var data: [[Double?]] = []

enum JsonDataCodingKey: String, CodingKey {

    case data
}

public init(from decoder: Decoder) throws {

    let container = try decoder.container(keyedBy: JsonDataCodingKey.self)

    var nestedContainer = try container.nestedUnkeyedContainer(forKey: .data)
    while !nestedContainer.isAtEnd {

        var innerContainer = try nestedContainer.nestedUnkeyedContainer()
        var dataSet: [Double?] = []
        while !innerContainer.isAtEnd {
            let value = try innerContainer.decodeIfPresent(Double.self)
            dataSet.append(value)
        }
        data.append(dataSet)
    }
}

}

但是使用这段代码我得到了一个问题,如果空字符串会出现类型不匹配。 -.- 我试了几个小时来解决这个问题,但我没有得到解决方案:(

希望有人能帮忙:)

你有一个选择是制作一个 enum 可以解码为 DoubleString 并解码这些数组。

另一种选择是捕获 typeMismatch 错误并继续:

var dataSet = [Double]()
while !innerContainer.isAtEnd {
    do {
        dataSet.append(try innerContainer.decode(Double.self))
    } catch DecodingError.typeMismatch {
        // Throw away the value by decoding something which doesn't actually decode.
        struct Empty : Codable {}
        let _ = try innerContainer.decode(Empty.self)
    }
}

此代码丢弃所有非 Double 值并删除 Optional,但您可以保留 Optional 键入并插入 nil 而不是抛出如果你愿意,可以去掉这些值。