नीचे वह कोड है जो JSON एपीआई को पार्स करने के लिए उपयोग कर रहा है। कोड काम करता है और मैं नीचे दी गई संरचना में सभी JSON मानों को पार्स करने में सक्षम हूं, लेकिन मैं जानना चाहता हूं कि केवल पहले ब्लॉक (?)/सरणी को कैसे पार्स किया जाए और उन्हें संरचना में संग्रहीत किया जाए ताकि मैं उन पर संचालन कर सकूं।

     let jsonUrlString = "https://www.alphavantage.co/query?function=FX_INTRADAY&from_symbol=EUR&to_symbol=USD&interval=5min&apikey=demo"

        let urlObj = URL(string: jsonUrlString)

        URLSession.shared.dataTask(with: urlObj!) {(data, response, error) in
            guard let data = data else { return }
            do {
                let forex = try JSONDecoder().decode(Root.self, from: data)
                print(forex.timeSeriesFX5Min)
            } catch {

                print(error)
            }

            }.resume()
    }
}

struct Root: Codable {
    let timeSeriesFX5Min: [String:Forex]

    enum CodingKeys: String, CodingKey {
        case timeSeriesFX5Min = "Time Series FX (5min)"
    }
}


    // MARK: - TimeSeriesFX5Min
    struct Forex: Codable {
        let the1Open, the2High, the3Low, the4Close: String

        enum CodingKeys: String, CodingKey {
            case the1Open = "1. open"
            case the2High = "2. high"
            case the3Low = "3. low"
            case the4Close = "4. close"
        }

    }
0
Leone Mitchell 19 जून 2019, 17:07

2 जवाब

सबसे बढ़िया उत्तर

मुझे ऐसा करने के दो तरीके दिखाई देते हैं, पहले रूट संरचना में बदलाव की आवश्यकता होती है जहां हमें संदेश के मेटा डेटा भाग का उपयोग करने की आवश्यकता होती है

struct Root: Codable {
    let metaData: [String: String]
    let timeSeriesFX5Min: [String:Forex]

    enum CodingKeys: String, CodingKey {
        case timeSeriesFX5Min = "Time Series FX (5min)"
        case metaData = "Meta Data"
    }
}

फिर हम "अंतिम ताज़ा" लेबल वाला आइटम उठाते हैं और समय श्रृंखला शब्दकोश में नवीनतम मूल्य प्रविष्टि देखने के लिए मूल्य का उपयोग करते हैं

do {
    let forex = try JSONDecoder().decode(Root.self, from: data)
    print(forex.metaData)
    if let latestTime = forex.metaData["4. Last Refreshed"], let latestForex = forex.timeSeriesFX5Min[latestTime] {
        print(latestForex)
    }        
} catch {
    print(error)
}

एक अन्य विकल्प इस तथ्य का लाभ उठाना है कि टाइमस्टैम्प इस तरह के प्रारूप में दिए गए हैं कि उन्हें ठीक से सॉर्ट किया जा सकता है इसलिए मेटा डेटा का उपयोग करने के बजाय हम कुंजियों को सॉर्ट करते हैं और अंतिम आइटम चुनते हैं

if let latestTime = forex.timeSeriesFX5Min.keys.sorted().last, let latestForex = forex.timeSeriesFX5Min[latestTime] {
     print(latestForex)
}
0
Joakim Danielson 19 जून 2019, 18:04

जब आप एक अनुरोध करते हैं तो आप शायद सूचित करेंगे कि कॉलबैक द्वारा अनुरोध मूल्य के साथ आपकी विधि को कौन कॉल करता है? तो आप अपनी वस्तु या सरणी वस्तु का एक नया उदाहरण बनाएंगे और परिणाम भरेंगे।

यदि आप इस संरचना में बनाएंगे तो आप अपना arrayObject लेंगे और .first का उपयोग करेंगे और इसके बाद अपना तर्क करेंगे ...

उदाहरण:

var newRoot: [Root] = [] 
func loadRoot() {
    Service().makeRequest() { (result, error) int
         newRoot = result.results
         print(newRoot.first)
    }
}

फ़ंक्शन "makeRequest ()" आपके द्वारा लिखी गई विधि को कॉल करेगा।

let jsonUrlString = "https://www.alphavantage.co/query?function=FX_INTRADAY&from_symbol=EUR&to_symbol=USD&interval=5min&apikey=demo"

    let urlObj = URL(string: jsonUrlString)

    URLSession.shared.dataTask(with: urlObj!) {(data, response, error) in
        guard let data = data else { return }
        do {
            let forex = try JSONDecoder().decode(Root.self, from: data)
            print(forex.timeSeriesFX5Min)
        } catch {

            print(error)
        }

        }.resume()
}
}
0
Wesley Brito 19 जून 2019, 17:30