我正在查询 WebService,并得到以下响应:
{
"pageSize": 50,
"pageNum": 1,
"totalCount": 1146,
"totalPages": 23,
"items": [
{
"type": "Feature",
"properties": {...},
"geometry": {
"type": "GeometryCollection",
"geometries": [
{
"type": "Point",
"coordinates": [
0.15,
35.22
]
}
]
}
}
]
}
“项目”是 GeoJSON 对象。
在 Swift 中,我可以使用以下方法解析 GeoJSON 对象:
MKGeoJSONDecoder().decode(data)
,但是如何解析整个响应(以 pageSize 等开头,然后在 items
成员中包含 GeoJSON 项数组)?
如果我像这样定义根对象
struct WebServiceResponse: Codable {
let pageSize: Int
let pageNum: Int
let totalCount: Int
let totalPages: Int
let items: [MKGeoJSONObject]
}
我得到
Type 'WebServiceResponse' does not conform to protocol 'Decodable'
,这似乎合乎逻辑,因为 MKGeoJSONObject 定义为
public protocol MKGeoJSONObject : NSObjectProtocol {
}
所以没有提到它是可解码的。
我可以手动删除第一位(以及响应末尾的大括号),这样我就只剩下这一点了:
[
{
"type": "Feature",
"properties": {...},
"geometry": {
"type": "GeometryCollection",
"geometries": [
{
"type": "Point",
"coordinates": [
0.15,
35.22
]
}
]
}
}
]
并使用 MKGeoJSONDecoder 解析它......但这对我来说听起来像是一个黑客。
MKGeoJSONDecoder
与 Codable
配合不佳,就像 JSONSerialization
与 Codable
配合不佳一样。
您基本上需要编写自己的代表 GeoJSON 模型的
Codable
类型。有人已经这样做了。您可以使用像 CodableGeoJSON 这样的包。
struct WebServiceResponse: Codable {
let pageSize: Int
let pageNum: Int
let totalCount: Int
let totalPages: Int
let items: [GeoJSON]
}
GeoJSON
是一个具有关联值的枚举,每种情况代表每种 GeoJSON 数据。
如果您知道将获得哪种特定类型的 GeoJSON,则可以使用更专业的类型,
// if you know it will be an array of features
let items: [GeoJSON.Feature]
// if you know it will be an array of features represented by points:
let items: [GeoJSONFeature<PointGeometry, LocationProperties>]
// 'LocationProperties' above represents the data in the 'properties' key
// and so on...