如何在 UI 中显示已解析的 JSON 数据?
How to display parsed JSON data in UI?
我已经从 API 调用中收到的 JSON 对象解析了数据。截至目前,我可以在调试器控制台中打印 JSON 数据,但是我正在尝试将解析的 JSON 转换回可以在 UI 中显示的数据。我有两个模型,JSON 对象的示例如下所示:
{
"query": "milk",
"sort": "relevance",
"responseGroup": "base",
"totalResults": 693,
"start": 1,
"numItems": 10,
"items": [{
"itemId": 10291863,
"parentItemId": 10291863,
"name": "Carnation Vitamin D Added Evaporated Milk, 12 oz",
"msrp": 1.79,
"salePrice": 1.48
}]
}
我只想显示详细说明 name
和 salePrice
键的信息。但是,由于 JSON 是嵌套的,我不知道如何到达该层以检索值。这是我的数据模型代码:
struct Item: Codable {
let query: String
let sort: String
let responseGroup: String
let totalResults: Int
let start: Int
let numItems = 25
let items: [Product]
}
struct Product: Codable {
let name: String
let salePrice: Double
}
代码到我的ViewController:
class ViewController: UIViewController {
@IBOutlet weak var itemField: UITextField!
@IBAction func filterButton(_ sender: Any) {
var components = URLComponents()
components.scheme = "http"
components.host = "api.walmartlabs.com"
components.path = "/v1/search"
let queryItemKey = URLQueryItem(name: "apiKey", value: secretKey)
var queryItemQuery = URLQueryItem(name: "query", value: itemField.text)
components.queryItems = [queryItemKey, queryItemQuery]
let searchURL = components.url
//Task to make API Network Call
guard let url = components.url else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print(error!.localizedDescription)
}
guard let data = data else { return }
//Implement JSON decoding and parsing
do {
//Decode retrived data with JSONDecoder and assing type of Item object
let productData = try JSONDecoder().decode(Item.self, from: data)
print(productData)
} catch let jsonError {
print(jsonError)
}
}.resume()
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
当我 运行 我的代码时,打印日志显示以下内容(同样,我只想显示 name
和 salePrice
值。有没有办法可以放置这些数组中的值或以我可以填充 UI 的方式转换这些值?提前致谢。
您可以尝试一个简单的循环:
for product in productData.items {
print("\(product.name) : \(product.salePrice)")
}
或闭包方式:
productData.items.forEach { print("\([=11=].name) : \([=11=].salePrice)") }
实际上您的产品已经在一个数组中:productData.items
评论后编辑
您可以映射您的字段以获取单独数组中的每个值:
let names = productData.items.map { [=12=].name }
let salePrices = productData.items.map { [=12=].salePrice }
创建数据源数组
var products = [Product]()
解析数据后将产品数组分配给数据源数组并重新加载 table 视图
...
let productData = try JSONDecoder().decode(Item.self, from: data)
self.products = productData.items
DispatchQueue.main.async {
self.tableView.reloadData()
}
在numberOfRowsInSection
returnproducts.count
在cellForRow
中获取当前产品并将值分配给标签
let product = products[indexPath.row]
cell.textLabel!.text = product.name
cell.detailTextLabel!.text = "\(product.salePrice)"
我已经从 API 调用中收到的 JSON 对象解析了数据。截至目前,我可以在调试器控制台中打印 JSON 数据,但是我正在尝试将解析的 JSON 转换回可以在 UI 中显示的数据。我有两个模型,JSON 对象的示例如下所示:
{
"query": "milk",
"sort": "relevance",
"responseGroup": "base",
"totalResults": 693,
"start": 1,
"numItems": 10,
"items": [{
"itemId": 10291863,
"parentItemId": 10291863,
"name": "Carnation Vitamin D Added Evaporated Milk, 12 oz",
"msrp": 1.79,
"salePrice": 1.48
}]
}
我只想显示详细说明 name
和 salePrice
键的信息。但是,由于 JSON 是嵌套的,我不知道如何到达该层以检索值。这是我的数据模型代码:
struct Item: Codable {
let query: String
let sort: String
let responseGroup: String
let totalResults: Int
let start: Int
let numItems = 25
let items: [Product]
}
struct Product: Codable {
let name: String
let salePrice: Double
}
代码到我的ViewController:
class ViewController: UIViewController {
@IBOutlet weak var itemField: UITextField!
@IBAction func filterButton(_ sender: Any) {
var components = URLComponents()
components.scheme = "http"
components.host = "api.walmartlabs.com"
components.path = "/v1/search"
let queryItemKey = URLQueryItem(name: "apiKey", value: secretKey)
var queryItemQuery = URLQueryItem(name: "query", value: itemField.text)
components.queryItems = [queryItemKey, queryItemQuery]
let searchURL = components.url
//Task to make API Network Call
guard let url = components.url else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print(error!.localizedDescription)
}
guard let data = data else { return }
//Implement JSON decoding and parsing
do {
//Decode retrived data with JSONDecoder and assing type of Item object
let productData = try JSONDecoder().decode(Item.self, from: data)
print(productData)
} catch let jsonError {
print(jsonError)
}
}.resume()
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
当我 运行 我的代码时,打印日志显示以下内容(同样,我只想显示 name
和 salePrice
值。有没有办法可以放置这些数组中的值或以我可以填充 UI 的方式转换这些值?提前致谢。
您可以尝试一个简单的循环:
for product in productData.items {
print("\(product.name) : \(product.salePrice)")
}
或闭包方式:
productData.items.forEach { print("\([=11=].name) : \([=11=].salePrice)") }
实际上您的产品已经在一个数组中:productData.items
评论后编辑
您可以映射您的字段以获取单独数组中的每个值:
let names = productData.items.map { [=12=].name }
let salePrices = productData.items.map { [=12=].salePrice }
创建数据源数组
var products = [Product]()
解析数据后将产品数组分配给数据源数组并重新加载 table 视图
...
let productData = try JSONDecoder().decode(Item.self, from: data)
self.products = productData.items
DispatchQueue.main.async {
self.tableView.reloadData()
}
在numberOfRowsInSection
returnproducts.count
在cellForRow
中获取当前产品并将值分配给标签
let product = products[indexPath.row]
cell.textLabel!.text = product.name
cell.detailTextLabel!.text = "\(product.salePrice)"