首页 > 解决方案 > 解码 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])
    }

}

标签: jsonswifturlsession

解决方案


推荐阅读