首页 > 解决方案 > SWIFTUI 中的 JSON 解析数据

问题描述

在我非常基本的代码中,我需要从 JSON 获取数据。但我只得到一个值。我有这个输入 JSON:

{
  "features": 
  [
    {
            "geometry":
            {
                    "coordinates": [
                        14.49961,
                        50.03353
                    ],
                    "type": "Point"
            }
        },
        {
            "geometry":
            {
                    "coordinates": [
                        14.4213,
                        50.00144
                    ],
                    "type": "Point"
            }
    }
  ],
  "type": "FeatureCollection"
}

以及 SwiftUI 中的这段代码,我需要在其中获取所有数据抛出 JSON。字段“类型”的值有效,但我无法获得其他字段 - 我做错了什么?

import Foundation
import SwiftUI
import MapKit
import Combine

class fetchResults{
    func getData(completion: @escaping (RequestA) -> ()){
        let url = URL(string: "https://api.golemio.cz/v2/vehiclepositions?limit=2")!
        var request = URLRequest(url: url)
        request.addValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
        request.addValue("XXXXXXXXXXXXXXXX", forHTTPHeaderField: "x-access-token")
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            let result = try! JSONDecoder().decode(RequestA.self, from: data!)
            if let response = response {
                
                if let data = data, let body = String(data: data, encoding: .utf8) {
                   
                    DispatchQueue.main.async {
                                    completion(result)
                                }
                }
            } else {
                print(error ?? "Unknown error")
            }
        }
        task.resume()
    }
}

struct RequestA: Decodable {
    var features: [Features]!
    var type: String
}

struct Features: Decodable {
    var geometry: Geometry
}

struct Geometry: Decodable {
    var coordinates: [Double]
    var type: String
}

struct ContentView: View {
    @State var res = RequestA()
    var body: some View {
        Text(res.type ?? "N/A")           // <<< "res.type" work but "res.features.geometry.coordinates[0] not
                     .onAppear()
                     {
                        fetchResults().getData
                        {(res) in
                            self.res = res    
                        }
                     }
  }
}

我会很高兴,如果有人帮我告诉我,我做错了什么。

标签: jsonswift

解决方案


res.features.geometry.coordinates

res 是RequestA并且 " RequestA" 具有features类型的属性[Features]- 一个 "Features" 数组

Array of features没有属性“ geometry”所以你不能写一个像res.features.geometry

您的意思是RequestA“功能”属性不是类型Features[Features]?或者你的意思是对数组中的每个特性做一些事情,或者可能是第一个特性等等?

如果您对解析 GeoJSON 感兴趣,请参阅Swift GeoJson Parse


推荐阅读