如何从 SwiftUI 中的 API 异步解析 JSON,其中响应不是数组?

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

我正在尝试从 SwiftUI 中的 API 解析 JSON,其中响应不是数组,这似乎是我可以从搜索中在线找到的唯一方法。

响应数据示例如下:

{
  "BillingAccount": {
    "AccountType": "Trial",
    "AccountBalance": 999.99,
    "TransactionCost": 999.99,
    "ExtraInformation": {}
  },
  "TechnicalSupport": {
    "ServerId": "UK1",
    "RequestId": "442bbc3766074970bc6ac850dab0e851",
    "QueryDurationMs": 27,
    "SupportDate": "08/07/2024",
    "SupportTime": "10:09:36",
    "SupportCode": "442bbc37",
    "SupportInformationList": [
      "B2B-R2"
    ]
  }
}

我的测试 ContentView 如下所示:

struct Response: Codable {
    var BillingAccount: BillingAccount
    var TechnicalSupport: TechnicalSupport
}

struct BillingAccount: Codable {
    var AccountType: String
    var AccountBalance: Int
    var TransactionCost: Int
}

struct TechnicalSupport: Codable {
    var ServerId: String
    var RequestId: String
    var QueryDuration: Int
    var SupportDate: String
    var SupportTime: String
    var SupportCode: String
    var SupportInfo: [String]
}

struct ContentView: View {
    @State private var results = Response()
    
    let domain = "https://www.domainName.co"
    @State var type: String = "type"
    @State var apikey: String = "apiKey"
    @State var content: String = "content"
    
    var body: some View {
        Text(results.AccountType)
        .task {
            await loadData()
        }
    }
    
    func loadData() async {
        
        guard let url = URL(string: "\(domainName)/api/datapackage/\(type)?v=2&api_nullitems=1&auth_apikey=\(apiKey)&key_content=\(content) ") else {
            print("Invalid URL")
            return
        }
        
        do {
            let (data, _) = try await URLSession.shared.data(from: url)
            if let decodedResponse = try? JSONDecoder().decode(Response.self, from: data) {
                results = decodedResponse.Response
            }
        } catch {
            print("Invalid data")
        }
    }
}

我遵循了 Hacking With Swift 的各种教程,并成功地用这些示例解析了 JSON。一个从 iTunes API 解析 JSON,另一个从白宫请愿书中解析。两者都返回包含数组中数据的 JSON。

但无论我如何尝试,我都无法解析 JSON。通过上面的代码,我目前得到“@State private var results = Response()”行的“Missing argument for argument 'from' in call”。以及“results = deocdedRepsonse.Repsonse”行上的“‘Response’类型的值没有成员‘Response’”错误。

对此的任何帮助以及任何关于为什么我可能会觉得这很困难的解释都将不胜感激。

附注我知道 API 正在返回良好的数据,因为我通过 RapidAPI 连接了 API。

我搜索了其他堆栈溢出帖子,并遵循了许多有关从 API 解析 JSON 的 Hacking With Swift 教程。遵循 Apple 教程解析 JSON。

我只需要解析这个 JSON。当数据不是数组时,我只是不知道如何解析数据。

我尝试了多种不同的方法,但总是遇到错误,最终却没有成功。

json swift api parsing
1个回答
0
投票

@State private var results = Response()
的问题是尝试创建一个空的 Response() 对象,但你没有任何 init() 。您可以在 Response 结构中创建 init() 并用其中的空值初始化所有内容。

© www.soinside.com 2019 - 2024. All rights reserved.