我正在尝试使用 Swift Struct 的 Encodable 协议解析以下 json。如果我制作坐标Any
或AnyObject
它给出错误,说不符合协议。
我知道这可以使用数组和字典来实现,但我不想那样做。
{
"coordinates": [
[
[
0.148271,
51.6723432
],
[
0.148271,
51.3849401
],
[
-0.3514683,
51.3849401
],
[
-0.3514683,
51.6723432
],
[
0.148271,
51.6723432
]
]
]
}
struct Geometry: Codable {
let coordinates: [[[Double]]]
init(from decoder: Decoder) throws {
let data = try decoder.container(keyedBy: CodingKeys.self)
coordinates = try data.decode([[[Double]]].self, forKey: .coordinates)
}
}
do {
let decoded = try JSONDecoder().decode(Geometry.self, from: data!)
print(decoded)
completionHandler(statusCode, decoded)
} catch {
print("Failed to encode data.")
completionHandler(statusCode, nil)
}
我该如何解决这个问题?
我的建议是使CLLocationCoordinate2D
符合Codable
解码的数组Double
import CoreLocation
extension CLLocationCoordinate2D : Codable {
public init(from decoder: Decoder) throws {
var arrayContainer = try decoder.unkeyedContainer()
if arrayContainer.count == 2 {
let lat = try arrayContainer.decode(CLLocationDegrees.self)
let lng = try arrayContainer.decode(CLLocationDegrees.self)
self.init(latitude: lat, longitude: lng)
} else {
throw DecodingError.dataCorruptedError(in: arrayContainer, debugDescription: "Coordinate array must contain two items")
}
}
public func encode(to encoder: Encoder) throws {
var arrayContainer = encoder.unkeyedContainer()
try arrayContainer.encode(contentsOf: [latitude, longitude])
}
}
然后你可以Geometry
简单地声明
struct Geometry: Codable {
let coordinates: [[CLLocationCoordinate2D]]
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句