json - 解码 Json Swift 4 Codable Type Any

标签 json swift swift4 codable decodable

大家好,我遇到了解码问题。我有一个看起来像这样的 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 如果您愿意,不要丢弃这些值。

关于json - 解码 Json Swift 4 Codable Type Any,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49493966/

相关文章:

javascript - Json 合并左或右 Typescript

ios - Swift - 存储 View 的堆叠顺序

ios - swift 2.0 @available 不起作用

swift - 在 CTsliding Up 面板中底部 Controller 显示 nil

ios - String 数组的一个元素不会打印到 Swift4 中的 UITextField 中。转换为任何或字符串

android - 如何从我的位置在 Google Maps API V2 中绘制路线

c# - Json.net 反序列化返回一个空对象

java - @JsonCreator 和 mixin 通过模块不适用于第 3 方类

ios - 在 iOS 中旋转屏幕时如何执行某些操作?

ios - json 解析时无法使用 Codable Concept swift 4 管理 nil