[NIL值解码嵌套的JSON-SwiftUI

问题描述 投票:0回答:1

在解码“非常简单的”嵌套JSON时得到nil,我在这里缺少什么?

Simulator Screenshot

[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个回答
0
投票

发现问题;

那只是愚蠢的我...

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

.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()
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.