如何在 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 调用以检索数据源