【发布时间】: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()
}
}
}
提前致谢!
【问题讨论】: