首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解码Json Swift 4可编码类型任意

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

Stack Overflow用户
提问于 2018-03-26 14:32:30
回答 1查看 875关注 0票数 0

嘿,伙计们,我对解码有问题。我有一个Json,看起来像这样:

代码语言:javascript
复制
"data": [
            [
                DoubleValue,
                DoubleValue,
                DoubleValue,
                DoubleValue,
                DoubleValue,
                "",
                ""
            ],
            [
                DoubleValue,
                DoubleValue,
                DoubleValue,
                DoubleValue,
                DoubleValue,
                "",
                ""
            ],
            [
                DoubleValue,
                DoubleValue,
                DoubleValue,
                DoubleValue,
                DoubleValue,
                "",
                ""
            ]
]

因此,我的建议是创建一个let数据,其中包含一个[Any],但这将不能用于可编码和[Double],因为如果该值为空,则api将向我发送空字符串,我将得到一个typeMismatch错误。

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

我现在的可编码

代码语言:javascript
复制
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)
    }
}

}

但是,使用这段代码,如果空字符串出现的话,我就会遇到typeMismatch这个问题。

希望有人能帮忙:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-26 14:44:04

您可以选择一个enum,它可以解码为DoubleString,并解码其中的数组。

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

代码语言:javascript
复制
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,而不是随意丢弃这些值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49493966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档