कोडेबल बनाम ऑब्जेक्टमैपर

फोटो https://unsplash.com/photos/_rNVw54xZZg

मैं हाल ही में स्विफ्ट के नए कोडेबल प्रोटोकॉल के साथ प्रयोग कर रहा हूं, क्योंकि JSON को दूरस्थ सेवा से स्विफ्ट मॉडल ऑब्जेक्ट में मैप करने का एक तरीका है।

थोड़ी सी पृष्ठभूमि के लिए, स्विफ्ट 4 में कोडेबल को जोड़ा गया था ताकि वस्तुओं को सफाई से बाहरी प्रतिनिधित्व में खुद को परिवर्तित करने की अनुमति मिल सके। कोडेबल ही डिकोडेबल और एनकोडेबल का एक प्रकार है।

इस पोस्ट के लिए, मैं डिकोडेबल भाग पर ध्यान केंद्रित करने जा रहा हूं, क्योंकि यह एक दूरस्थ JSON प्रतिनिधित्व से रूपांतरण है जिसमें मैं रुचि रखता हूं।

तुलना

मैंने अतीत में बड़े पैमाने पर ObjectMapper का उपयोग किया है, लेकिन जैसा कि कोडेबल अब स्विफ्ट में बनाया गया है, मैं दोनों की तुलना करना चाहता था। जिन विशेषताओं की मैं तुलना करना चाहता हूं वे हैं:

  • मान्यता ️
  • कस्टम परिवर्तन (कस्टम प्रकारों में मैपिंग, उदा। JSON स्ट्रिंग को एक रेगेक्स में मैप करना) into
  • त्रुटि से निपटने

मैं जिस डेटा को पार्स करने जा रहा हूं वह वास्तविक कॉन्फिग है जिसे हम बीबीसी स्पोर्ट ऐप के लिए दूरस्थ रूप से प्राप्त करते हैं

यह एक बहुत ही सरल JSON संरचना है, लेकिन इसमें कुछ नियमित अभिव्यक्तियाँ मिली हैं कि मैं NSRegularExpression में मैप किया जाना पसंद करता हूं, स्ट्रिंग नहीं

ObjectMapper

ObjectMapper के साथ इस JSON मॉडल को मैप करने के लिए आवश्यक संरचनाएं इस प्रकार हैं।

Stucts सभी ImmutableMappable प्रोटोकॉल के अनुरूप है, जिसका अर्थ है कि उन्हें एक निर्माता की आवश्यकता है जो मैप ऑब्जेक्ट लेता है और मैपिंग विफल होने पर एक त्रुटि फेंकता है।

मान्यकरण

सत्यापन करने के लिए आप वैकल्पिक का उपयोग कर सकते हैं। इस उदाहरण में हमने फैसला किया है कि ऐप इन ईमेल पतों के बिना काम कर सकता है इसलिए ईमेल वैकल्पिक हैं। map.values ​​("ईमेल") एक त्रुटि फेंकता है अगर वे मौजूद नहीं हैं या इसे सही प्रकार पर नहीं डाला जा सकता है। हम कोशिश का उपयोग करते हैं? उस त्रुटि को पकड़ने के लिए और यदि कोई त्रुटि है, तो इसे शून्य मान में बदल दें।

यदि हम तय करते हैं कि किसी विशेष संपत्ति की आवश्यकता है तो हम इसे वैकल्पिक के रूप में चिह्नित नहीं करते हैं और त्रुटि को प्रचारित करने की अनुमति देते हैं।

कुल मिलाकर ImmutableMappable का उपयोग करके सत्यापन बहुत सीधा है

आपने देखा होगा कि इस कॉल map.value ("regex" में एक अतिरिक्त तर्क दिया गया है, का उपयोग करके: RegexTransformer ()) जो कि कस्टम परिवर्तन के लिए स्ट्रिंग को एक NSRegularExpression में बदलने के लिए मेरे अगले बिंदु पर अच्छी तरह से ले जाता है!

कस्टम परिवर्तन

ObjectMapper बॉक्स से बाहर कस्टम परिवर्तनों का समर्थन करता है, और यह बहुत आगे है।

यहां हम केवल ट्रांसक्रिप्ट प्रोटोकॉल और संबंधित ट्रांसफ़ॉर्म जॉन्सन विधि को लागू कर रहे हैं। यह एक प्रकार में लेता है और जिसे हम स्ट्रिंग में डालते हैं और फिर सुरक्षित रूप से प्रयास करते हैं? स्ट्रिंग को एक NSRegularExpression में परिवर्तित करने के लिए।

यह ट्रांसफार्मर फिर कहीं भी उपयोग करने के लिए उपलब्ध है to

गलती संभालना

गुम आउटपुट कुंजी के साथ JSON फ़ाइल का उपयोग करने में त्रुटि से निपटने के लिए मैं परीक्षण करूंगा।

ObjectMapper के माध्यम से इसे चलाते समय हमें एक अच्छा सहायक त्रुटि संदेश मिलता है।

मैपिंग करते समय एक त्रुटि हुई।
- कारण: 'स्ट्रिंग' को कास्ट नहीं किया जा सकता
- स्थान: config.init (नक्शा :): 30
- कुंजी: आउटपुट
- currentValue: नील

यह हमें वह सब कुछ बताता है जो हमें जल्दी से खोजने की जरूरत है कि मुद्दा कहां है। मैंने पाया है कि जब AlamofireObjectMapper एकीकरण का उपयोग करते हुए त्रुटियों को दबा दिया जाता है जो आदर्श से कम है।

Codable

बॉक्स से बाहर समान कोडेबल कार्यान्वयन निम्नानुसार है

यह ऑब्जेक्टमैपर के समान है, हालांकि कुंजी को कोडिंगके प्रोटोकॉल का उपयोग करते हुए एनम के रूप में परिभाषित किया गया है।

कोडेबल का उपयोग करने में वास्तव में एक अच्छी सुविधा है कि आपके लिए इनिशियल उत्पन्न हो सकता है यदि वे एनाम केस संपत्ति के बराबर हैं, और जिस प्रकार हम मैपिंग कर रहे हैं वह स्वयं Decodable है इसका एक उदाहरण ऊपर CodableConfig है। चूँकि यह सभी गुण स्वयं घटित होते हैं इसलिए हमें इनिशियलाइज़र लिखने की आवश्यकता नहीं है!

मान्यकरण

यह बिल्कुल ObjectMapper की तरह काम करता है

यदि कोई त्रुटि मानचित्रण है, जो कॉल साइट पर संभाला जा सकता है, तो इनिलाइज़र एक त्रुटि फेंकता है। फिर, त्रुटियों को संभालने के लिए सबसे अच्छा निर्णय लेने के लिए यहां वैकल्पिक का अच्छा उपयोग करें।

कस्टम परिवर्तन

आप उपरोक्त कोड में ध्यान देंगे, यह सब कुछ कम स्पष्ट हो जाता है जब हम अपने NSRegularExpression प्रकार पर मैप करने का प्रयास कर रहे हैं। हमें अचानक इनिशियेटर इनिट (डिकोडर: डिकोडर से) को लागू करना होगा और खुद को डिकोडर से एक कीडेकोडिंग कोडनकरना होगा।

यदि आप अधिक विवरण पसंद नहीं करते हैं, तो इस बारे में पहले से ही एक बढ़िया राइटअप है, जिसे मैं यहाँ नहीं जाना चाहता।

कोड अब लिखने के लिए काफी क्रियाशील हो गया है, और हम परिवर्तन कोड को दोहरा रहे हैं। इस मामले में यह केवल एक अतिरिक्त रेखा है लेकिन ऐसे कई बार होते हैं जब मैं अधिक जटिल परिवर्तन लिखना चाहता हूं जिसे मैं अलग करना चाहता हूं जैसे कि मैं ऑब्जेक्टमैपर के साथ कर सकता हूं

इसलिए मैंने कस्टम ट्रांसफ़ॉर्मेशन के लिए समर्थन जोड़ने के लिए एक छोटी सी लाइब्रेरी बनाई P यह कोकोआपॉड्स के माध्यम से उपलब्ध है, या आप स्रोत को कॉपी कर सकते हैं क्योंकि यह सिर्फ एक-दो फाइलों में है।

आप उस प्रकार के एक्सटेंशन को जोड़ने के बारे में सोच सकते हैं जो आप स्वयं नहीं करते हैं, लेकिन स्विफ्ट इवोल्यूशन पर यह संभव नहीं है, इस बात की अच्छी व्याख्या है।

CodableExtensions लाइब्रेरी का उपयोग करके अब हम ObjectMapper के समान दिखने के लिए अपने कोड को सरल बना सकते हैं

और RegexCodableTransformer भी हम पहले ObjectMapper के साथ था के समान है

लाइब्रेरी कंटेनर को भी इंटरफ़ेस को सरल बनाता है। इसलिए (अब यह अनुमान लगाने के लिए कि टाइप को पास करने की आवश्यकता नहीं है।

गलती संभालना

मैं पहले की तरह त्रुटि सौंपने की तुलना करने के लिए एक ही JSON फ़ाइल का उपयोग कर रहा हूं। त्रुटि दिखती है

keyNotFound (config_spike.CodableRewriter। (CodingKeys in _4D474241C6D85B5C48988D77CA644850)। ")।", अंतर्निहितशुरू: नील))

त्रुटि बहुत सुंदर नहीं लग रही है, लेकिन इस मुद्दे पर बहस करने के लिए सब कुछ मिल गया है।

निष्कर्ष

दोनों दृष्टिकोणों के बीच अंतर की तुलना में कहीं अधिक समानताएं हैं। यदि रूपांतरण महत्वपूर्ण हैं, तो ObjectMapper बॉक्स से बाहर काम करता है। हालांकि, स्विचिंग के लिए मुख्य प्रेरकों में से एक मानक के लिए आगे बढ़ रहा है जिसे Apple ने किसी अन्य पुस्तकालय में लाने के बिना बनाया है।

यदि परिवर्तन महत्वपूर्ण हैं, तो कुछ प्रोटोकॉल जोड़कर, आप कोडेबल के साथ समान व्यवहार प्राप्त कर सकते हैं

हमने अपनी सभी नई सुविधाओं को आगे बढ़ाने के लिए अब कोडेबल में जाने का फैसला किया है। मुझे यकीन है कि मैं इस सूची से चूक गया था, लेकिन मैंने हमारे लिए सबसे महत्वपूर्ण चीजें चुनीं।