【问题标题】:NIL value decoding nested JSON - SwiftUINIL 值解码嵌套 JSON - SwiftUI
【发布时间】:2020-05-09 13:54:29
【问题描述】:

我在解码“相当简单”的嵌套 JSON 时收到 nil,我在这里缺少什么?

NetworkController 部分(连同整个 ContentView)与“普通”JSON(即 {"greetings": "hi"})完美配合,但我仍然得到带有嵌套 JSON 结构的 nil

这是我的 JSON:

index.json

{
  "products": {
    "pasta": 81.22,
    "pizza": 13.81,
    "apples": 0,
    "sausages": 2.36,
    "potatoes": 0.55,
    "cucmbers": 2.06,
    "oranges": 0
  }
}

这是我的代码:

DataStruct.swift

struct ProductWrapper: Decodable {
    var products: Product
}

struct Product: Decodable {
    var pasta: Double
    var pizza: Double
    var apples: Double
    var sausages: Double
    var potatoes: Double
    var cucmbers: Double
    var oranges: Double
}

ContentView.swift

import SwiftUI

class ProductsList: ObservableObject {
    @Published var prods: ProductWrapper? = nil
    func fetchProducts() {
        NetworkController.fetchProducts { prods in
            self.prods = prods
        }
    }
}

struct ContentView: View {

    @ObservedObject var DecodedProducts = ProductsList()

    var body: some View {

        VStack{

            HStack{
                Text("Pasta: ")
                Text(String("\(self.DecodedProducts.prods?.products.pasta)")).fontWeight(.bold).foregroundColor(.red)
            }

            HStack{
                Text("Pizza: ")
                Text(String("\(self.DecodedProducts.prods?.products.pizza)")).fontWeight(.bold).foregroundColor(.blue)
            }

            HStack{
                Text("Apples: ")
                Text(String("\(self.DecodedProducts.prods?.products.apples)")).fontWeight(.bold).foregroundColor(.green)
            }

        }.padding()
    }
}

NetworkManager.swift

import Foundation

struct NetworkController {
    static func fetchProducts(completion: @escaping ((ProductWrapper) -> Void)) {
        if let url = URL(string: "http://localhost:1234/index.json") {
            let request = URLRequest(url: url)
            URLSession.shared.dataTask(with: request) { (data, resp, err) in
                do {
                    if let products = data {
                        let prods = try JSONDecoder().decode(ProductWrapper.self, from: products)
                        DispatchQueue.main.async() {
                            completion(prods)
                        }
                    } else {
                        print("Error Found")
                    }
                } catch let err as NSError {
                    print(err.localizedDescription)
                }
            }.resume()
        }
    }
}

提前致谢!

【问题讨论】:

    标签: json swiftui


    【解决方案1】:

    发现问题;

    那只是一个愚蠢的我......

    忘记在onAppear中调用fetchProducts() *facepalm*

    .onAppear{
    self.DecodedProducts.fetchProducts()
    }
    

    这是正确的代码:

    ContentView.swift

    import SwiftUI
    
    class ProductsList: ObservableObject {
        @Published var prods: ProductWrapper? = nil
        func fetchProducts() {
            NetworkController.fetchProducts { prods in
                self.prods = prods
            }
        }
    }
    
    struct ContentView: View {
    
        @ObservedObject var DecodedProducts = ProductsList()
    
    
    
        var body: some View {
    
            VStack{
    
                HStack{
                    Text("Pasta: ")
                    Text(String("\(self.DecodedProducts.prods?.products.pasta ?? 0)")).fontWeight(.bold).foregroundColor(.red)
                }
    
                HStack{
                    Text("Pizza: ")
                    Text(String("\(self.DecodedProducts.prods?.products.pizza ?? 0)")).fontWeight(.bold).foregroundColor(.blue)
                }
    
                HStack{
                    Text("Apples: ")
                    Text(String("\(self.DecodedProducts.prods?.products.apples ?? 0)")).fontWeight(.bold).foregroundColor(.green)
                }
    
            }.onAppear{
                self.DecodedProducts.fetchProducts()
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多