मैं कॉकटेलडीबी एपीआई के साथ काम कर रहा हूं और कुछ समस्याएं आ रही हैं।
मैं विशिष्ट श्रेणी से कॉकटेल (प्रत्येक कॉकटेल का नाम और छवि) प्राप्त करने का अनुरोध करता हूं। फिर मैं JSON को डीकोडेबल प्रोटोकॉल के साथ पार्स करने का प्रयास करता हूं। लेकिन यह काम नहीं करता है और JSON त्रुटि प्रदर्शित होती है।

इसलिए मैं निम्नलिखित अनुरोध "https://www.thecocktaildb.com/api/json/v1/1/list.php?c=list" से कॉकटेल श्रेणियां प्राप्त करना चाहता हूं और प्रत्येक श्रेणी के लिए एक अनुभाग है (प्रदर्शन श्रेणी का नाम एक हेडर) इस खंड के कॉकटेल के साथ।

मेरा पेय मॉडल:

struct Drinks:Decodable {
    var drinks: [Drink]
}

struct Drink:Decodable {
    var strDrink: String
    var strDrinkThumb: String
}

मेरी श्रेणी मॉडल:

struct Categories: Decodable {
    var drinks: [Drink]
}

struct Category: Decodable {
    var strCategory: String
}

मेरा कोड:

    class ViewController: UIViewController {

        var drinks = [Drinks]()
        var categories = [Categories]()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            downloadJSON()
        }
        
        func downloadJSON() {
            let category = "Cocoa" // for example
            let url = URL(string: "https://www.thecocktaildb.com/api/json/v1/1/filter.php?c=\(category)")
            
            URLSession.shared.dataTask(with: url!) { (data, response, error) in
                
                if error == nil {
                    do {
                        self.drinks = try JSONDecoder().decode([Drinks].self, from: data!)
                        print(self.drinks)
                    } catch {
                        print("JSON Error")
                    }
                }
            }.resume()
        }
    }

extension ViewController: UITableViewDataSource, UITableViewDelegate {
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return drinks.count
    }
    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return ""
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return UITableViewCell(style: .default, reuseIdentifier: "cell")
    }
    
    
}

JSON संरचना:

enter image description here

-1
Veronika Babii 14 जुलाई 2020, 23:43
1
अर्थहीन "JSON Error" के बजाय error इंस्टेंस प्रिंट करें। यह आपको बताता है कि वास्तव में क्या गलत है और कहां है। संकेत: मूल वस्तु एक सरणी नहीं है।
 – 
vadian
14 जुलाई 2020, 23:58
1
print(error) और रिजल्ट चेक करें। "JSON त्रुटि" का कोई मतलब नहीं है
 – 
Leo Dabus
14 जुलाई 2020, 23:58
" typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [], debugDescription: "ऐरे को डिकोड करने की उम्मीद <कोई> लेकिन इसके बजाय एक शब्दकोश मिला।", अंतर्निहित त्रुटि: शून्य)) "त्रुटि प्रदर्शित होती है
 – 
Veronika Babii
15 जुलाई 2020, 00:02
[Drinks].self के बजाय Categories.self आज़माएं
 – 
Leo Dabus
15 जुलाई 2020, 00:04
नहीं, URL पर JSON के अनुसार यह Drinks.self है
 – 
vadian
15 जुलाई 2020, 00:07

2 जवाब

आपको यहां कुछ अतिरिक्त बदलाव करने होंगे। एक डिकोडिंग को Drinks.self में बदल देता है। फिर tableView को फिर से लोड करें। और सेक्शन हेडर के लिए स्ट्रिंग लौटाएं। यहाँ कोड है:

डिकोडिंग:

var drinks = [Drink]() // modify the drinks property 

if let data == data {
    do {
        self.drinks = try JSONDecoder().decode(Drinks.self, from: data).drinks
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    } catch {
        print(error)
    }
}

और titleForHeaderInSection विधि:

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return drinks[section].strDrink
}
1
Frankenstein 15 जुलाई 2020, 00:18
बस मेरी टिप्पणी के साथ तालमेल में stackoverflow.com/questions/62903702/…
 – 
Leo Dabus
15 जुलाई 2020, 00:12
आप हमेशा की तरह सबसे अच्छे हैं !!! बहुत - बहुत धन्यवाद!
 – 
Veronika Babii
15 जुलाई 2020, 00:15
धन्यवाद! भविष्य के प्रश्नों को और स्पष्ट करने का प्रयास करें। पोस्ट पढ़ने वाले व्यक्ति को उस सटीक समस्या को समझना चाहिए जिसका आप सामना कर रहे हैं।
 – 
Frankenstein
15 जुलाई 2020, 00:17

त्रुटि काफी स्पष्ट है। एक सरणी के बजाय (जैसा कि आपके [Drinks].self का तात्पर्य है) आपको एक शब्दकोश वापस मिलता है (जो आपके Drinks संरचना में मानचित्र करता है):

drinks = try JSONDecoder().decode(Drinks.self, from: data!)

जिसका निश्चित रूप से अर्थ है:

var drinks Drinks भी बन जाता है ([Drinks] के बजाय)

0
Alladinian 15 जुलाई 2020, 00:16
लेकिन पेय [पेय] है, इसलिए मैं [पेय] को पेय असाइन नहीं कर सकता
 – 
Veronika Babii
15 जुलाई 2020, 00:10
 – 
Leo Dabus
15 जुलाई 2020, 00:11
हां, निश्चित रूप से यह Drinks होना चाहिए न कि [Drinks]। मैं जवाब में संशोधन करूंगा।
 – 
Alladinian
15 जुलाई 2020, 00:14
डेटा को खोलने के लिए बाध्य न करें। एक गार्ड का प्रयोग करें guard let data = data else { return }
 – 
Leo Dabus
15 जुलाई 2020, 00:16
क्या यह कुछ कोड समीक्षा अभ्यास है?
 – 
Alladinian
15 जुलाई 2020, 00:17