解码 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
可以解码为 Double
或 String
并解码这些数组。
另一种选择是捕获 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 看起来像这样:
"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
可以解码为 Double
或 String
并解码这些数组。
另一种选择是捕获 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
而不是抛出如果你愿意,可以去掉这些值。