我收到包含嵌套 GeoJSON 的响应。我如何在 Swift 中解析它?

问题描述 投票:0回答:1

我正在查询 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 解析它......但这对我来说听起来像是一个黑客。

swift mapkit geojson
1个回答
0
投票
正如您所经历的,

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...
© www.soinside.com 2019 - 2024. All rights reserved.