如何在 SwiftUI 中显示来自 API 的 JSON 数据?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中显示来自 API 的 JSON 数据?【英文标题】:How to display JSON data from API in SwiftUI? 【发布时间】:2019-09-24 15:04:30 【问题描述】:

我有一个来自 API 的 JSON。我需要将其中的值显示为文本。

这是其中的一部分。

]
    
        "d": "2019-09-20",
        "v": 56.62
    ,
    
        "d": "2019-09-23",
        "v": 56.93
    
]

现在,我为它创建了模型,名为Dolar.swift

struct Dolar: Decodable 
    var d: String?
    var v: Double?

还有一个名为 WebService.swift 的类将处理调用:

class WebService 
    func getCurrency(completion: @escaping (Dolar?) -> ()) 
        guard let url = URL(string: "https://api.estadisticasbcra.com/usd_of") else  return 

        URLSession.shared.dataTask(with: url)  (data, response, error) in
            guard let data = data, error == nil else 
                return
            

            let currencyResponse = try? JSONDecoder().decode(Dolar.self, from: data)

            if let currencyResponse = currencyResponse 
                let dolar = currencyResponse
                print(dolar)
                completion(dolar)
             else 
                completion(nil)
            
        .resume()
    

API 的文档说它需要在请求中添加一个 TOKEN:

Authorization: BEARER TOKEN

我该怎么做?我有令牌,但不知道如何实现它。这是我的第一个问题。 其次,一旦我获得了价值,我如何在ContentView.swift 上显示它? 任何帮助表示赞赏。

【问题讨论】:

无论这是它的一部分,解码都不会起作用。 打印error 如果响应确实是Dolar 的数组,那么解码语句应该是JSONDecoder().decode([Dolar].self, from: data),但您的完成需要一个单数Dolar,所以有一些混乱需要澄清。 对不起,我无法掌握这个 JSON 解码,你能帮帮我吗?如果有帮助,我只需要 JSON 中的最后一个对象(最后一个“d”和“v”),但这可能是另一天的问题。我该如何解码? 【参考方案1】:

对于问题的第一部分,您需要使用URLSession.dataTask 的变体,它采用URLRequest。然后您需要检查响应是否有有效负载,它可以被解码为您的类型,并且它至少有一个值。比如:

let request = URLRequest(url: url)
request.setValue(token, forHTTPHeaderField: "Authorization")
// Or maybe:
// request.setValue("BEARER \(token)", forHTTPHeaderField: "Authorization")

URLSession.shared.dataTask(with: request)  (data, response, error) in
    guard let data = data else 
        return // Couldn't get data from service
    

    guard let values = JSONDecoder().decode([Dolar].self, from: data) else 
        return  // Couldn't decode data as array of `Dolar`s
    

    guard let finalValue = values.last else 
        return // No values in data
    

    // `finalValue` now describes the last element in your array
.resume()

查看URLSession 和URLRequest 的文档

【讨论】:

以上是关于如何在 SwiftUI 中显示来自 API 的 JSON 数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI URLSession 中显示来自服务器的错误消息

SwiftUI:如何在搜索栏的文本更改时触发 api 调用以检索数据源

SwiftUI - 如何在修改来自同一结构的状态变量时避免刷新列表

在 swiftUI 中显示来自多个选项的工作表

在 SwiftUI 中显示来自 CoreData 的图像

SwiftUi 水平滚动视图,带有来自 Api 的数据