json - 解码 JSON Web 响应
问题描述
我正在尝试解码一个简单的 JSON 字符串,但下面的“年龄”值并没有体现在我的观点中。
从本质上讲,Steak 对象将是一个特定的牛排并包含不变的信息(即哪个客人订购了它以及它是什么类型的切块)。Detail 对象将包含确实改变牛排的信息(即它在冰箱中的时间)
这是我的代码,知道我做错了什么吗?请让我知道是否还有其他我可以提供的有用的信息。提前致谢!
网址设置
import UIKit
class NetworkManager: NSObject {
struct Key {
static let networkKey: String = "key"
}
struct APIURL {
static func detailRequest(guest: String) -> String {
return "https://website=\(guest)&token=\(NetworkManager.Key.networkKey)".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
}
}
}
牛排对象(即迈克的牛排)
import SwiftUI
import Combine
class Steak: ObservableObject{
var guest: String
@Published var detail: [Detail]?
init() {
self.guest = "Mike"
self.detail = nil
self.getDetail()
}
private func getDetail() {
DetailManager.getDetail(for: self) { (detail) in
DispatchQueue.main.async {
self.detail = detail
}
}
}
}
import SwiftUI
import Combine
class SteakStore: ObservableObject {
@Published var steaks: [Steak] = [Steak()]
}
这是包含牛排细节的结构
import Foundation
struct Detail: Codable {
var age: Double
enum CodingKeys: String, CodingKey {
case age = "age"
}
}
import SwiftUI
extension Detail {
struct List<T: Codable & Identifiable>: Codable {
var list: [T]
enum CodingKeys: String, CodingKey {
case list = "data"
}
}
}
JSON解码功能
import Foundation
class DetailManager {
static func getDetail(for steak: Steak, _ completion: @escaping (_ detail: [Detail]?) -> Void) {
guard let url = URL(string: NetworkManager.APIURL.detailRequest(guest: steak.guest)) else {
completion(nil)
return
}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {
return
}
do {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970
let detailObject = try decoder.decode([Detail].self, from: data)
completion(detailObject)
} catch {
print(error.localizedDescription)
completion(nil)
}
}.resume()
}
}
生成这样的 JSON 输出
[
{
"guest": "Mike",
"cut": "filet mignon",
"age": 8.00
}
]
然后我进入这样的视图。我的问题是 8.00 的年龄没有通过,而是默认的 0.0
import SwiftUI
struct SteakRow : View {
@ObservedObject var steak: Steak
var body: some View {
HStack(alignment: .firstTextBaseline) {
Text(steak.guest)
.lineLimit(nil)
.font(.title)
Spacer()
HStack {
Text("\(steak.detail?.age ?? 0.0)")
.foregroundColor(.gray)
.font(.title)
}
}
.padding([.trailing, .top, .bottom])
}
}
解决方案
推荐阅读
- javascript - Vue如何使用渲染功能回退到默认渲染?
- fullcalendar - 完整的日历 IO 将列实现为单日视图
- r - 日期轴上缺少自定义中断和标签
- d3.js - d3.js 在文本属性中使用条件返回
- sql - 在 Big Query 中使用通配符查询按日期计算数据集中的记录数
- python - 如何通过图书馆电视节目在电报中搜索频道?
- javascript - 如何将一段css、html和js从一个静态模板复制到另一个?
- glassfish - GlassFish 服务器错误类 File.MikTex 未找到
- vuejs2 - vue.js 将插值传递给属性(类)绑定的方法
- blockchain - Hypelerdger Indy Node - 种子价值