मैं जेएसओएन को एक एपीआई से सीजीपॉइंट्स की एक सरणी में बदलने की कोशिश कर रहा हूं जिसे मैं कोर ग्राफिक्स में उपयोग कर सकता हूं।

JSON जैसा दिखता है:

{"date":"2017-01-05","open":119.34,"high":120.2,"low":119.1,"close":119.7,"adjusted_close":109.7062,"volume":4261070},{"date":"2017-01-06","open":118.93,"high":121.5,"low":118.52,"close":120.76,"adjusted_close":110.6777,"volume":4089186},{"date":"2017-01-09","open":120.76,"high":121.06,"low":120.33,"close":120.43,"adjusted_close":110.3754,"volume":3021844}

मुझे तारीख और करीबी क्षेत्रों में दिलचस्पी है और मैं उन्हें इस प्रारूप में बदलना चाहता हूं

 dataPoints:@[xy(val0,119.7),xy(val1,120.76),xy(val2,120.43)];

जहां val0...val3 ग्राफ के x आयाम में मैप की गई तिथियां हैं और मैंने परिभाषित किया है:

 #define xy(__x,__y) [NSValue valueWithCGPoint:CGPointMake(__x,__y)]

मैंने #define से शादी नहीं की है। यह सिर्फ कोड है जिसे CoreGraphics अभी उपयोग कर रहा है। अगर इसे एक संरचना या ऐसा करने का कोई और तरीका है जो बहुत अच्छा होगा।

मुझे पता है कि JSON को एक सरणी में कैसे डिकोड करना है:

struct StockReport: Codable {
    let date: String
    let stockDatumOpen, high, low, close: Double
    let adjustedClose: Double
    let volume: Int

    enum CodingKeys: String, CodingKey {
        case date
        case stockDatumOpen = "open"
        case high, low, close
        case adjustedClose = "adjusted_close"
        case volume
    }
}

typealias StockData = [StockReport]

let stockData = try? newJSONDecoder().decode(StockData.self, from: jsonData)

इसके अलावा, हालांकि, मुझे यकीन नहीं है कि सीजीपॉइंट्स की एक सरणी कैसे बनाई जाए।

मुझे लगता है कि मैं 1970 (युग) के बाद से तारीख के तार को सेकंड में बदल सकता हूं और फिर उन्हें समन्वय प्रणाली में स्केल कर सकता हूं। या मैं सरणी की अनुक्रमणिका को प्रत्येक दिन के अनुरूप पूर्णांक के रूप में उपयोग कर सकता हूं लेकिन जहां तक ​​​​मुझे मिल गया है। क्या मुझे सरणी स्टॉकडेटा के माध्यम से लूप करना चाहिए और एक-एक करके अंक बनाना चाहिए? क्या कोई और शानदार तरीका है?

किसी सुझाव के लिए अग्रिम धन्यवाद।

-1
user6631314 11 जुलाई 2020, 19:48

1 उत्तर

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

मान लें कि आपको एक वैध जेसन स्ट्रिंग प्राप्त हो रही है (आपके द्वारा पोस्ट की गई स्ट्रिंग एक वैध जेसन स्ट्रिंग नहीं है। आप अपनी ऑब्जेक्ट्स को इसकी तिथि से सॉर्ट कर सकते हैं (यदि वे पहले से सॉर्ट नहीं किए गए हैं), तत्वों की गणना करें और CGPoint को निम्नानुसार प्रारंभ करें:


let json = """
    [{"date":"2017-01-05",
     "open":119.34,
     "high":120.2,
     "low":119.1,
     "close":119.7,
     "adjusted_close":109.7062,
     "volume":4261070},
    {"date":"2017-01-06",
     "open":118.93,
     "high":121.5,
     "low":118.52,
     "close":120.76,
     "adjusted_close":110.6777,
     "volume":4089186},
    {"date":"2017-01-09",
     "open":120.76,
     "high":121.06,
     "low":120.33,
     "close":120.43,
     "adjusted_close":110.3754,
     "volume":3021844}]
"""

do {
    let stocks = try JSONDecoder().decode([StockReport].self, from: Data(json.utf8))
    let points = stocks.sorted{$0.date < $1.date}.enumerated().map {
        CGPoint(x: Double($0.offset), y: $0.element.close)
    }
    print(points)
} catch {
    print(error)
}

यह प्रिंट करेगा

[(0.0, 119.7), (1.0, 120.76), (2.0, 120.43)]

0
Leo Dabus 11 जुलाई 2020, 21:46