2013-07-02 4 views
7

Ember.js बाकी एडाप्टर उम्मीद JSON के रूप में वापस करने:Ember.js बाकी एडाप्टर JSON जड़ के बिना

{ 
    "person": { 
     "first_name": "Barack", 
     "last_name": "Obama", 
     "is_person_of_the_year": true 
    } 
} 

लेकिन मेरी एपीआई डेटा रिटर्न एक मूल तत्व बिना:

{ 
    "first_name": "Barack", 
    "last_name": "Obama", 
    "is_person_of_the_year": true 
} 

क्या आरईएसटी एडाप्टर को कस्टमाइज़ करना संभव है ताकि यह मेरे JSON डेटा को स्वीकार कर सके? अभी यह दिखा रहा है "अभिकथन में विफल रहा है: अपने सर्वर कुंजी 0 के साथ एक हैश लौटे, लेकिन आप के लिए कोई मैपिंग है यह"

अद्यतन: नीचे शेरविन यू के जवाब के आधार पर, यह है कि क्या मैं के साथ आया है , अब तक काम करने लगता है: https://gist.github.com/richardkall/5910875

उत्तर

8

हां, आप अपना खुद का कस्टम आरईएसटी एडाप्टर लिख सकते हैं। JSONSerializer, RESTSerializer (जो JSONSerializer को बढ़ाता है) में स्रोत कोड पर एक नज़र डालें, और REST adapter

असल में, आपको JSONSerializer से extract* विधियों को ओवरराइड करने की आवश्यकता है।

extract: function(loader, json, type, record) { 
    var root = this.rootForType(type); 

    this.sideload(loader, type, json, root); 
    this.extractMeta(loader, type, json); 

    if (json[root]) { 
    if (record) { loader.updateId(record, json[root]); } 
    this.extractRecordRepresentation(loader, type, json[root]); 
    } 
}, 

सूचना है कि यह कैसे json[root] की जाँच करता है - आप अपने उम्मीद एपीआई प्रतिक्रिया के आधार पर अपने कस्टम विधि लिखने के लिए होगा:

वर्तमान में, यह कुछ इस तरह लग रहा है।

एक और दृष्टिकोण रूट तत्व का उपयोग करने के लिए एपीआई से जेसन को "प्रीप्रोसेस" करना होगा। आप यह जानकर यह कर सकते हैं कि extract* (जो इसे जेसन पास करता है) कहता है और इससे पहले कि जेसन को रूट तत्व को संशोधित करने के लिए संशोधित करें।

उम्मीद है कि यह मदद करता है, अगर यह अस्पष्ट है तो कृपया मुझे बताएं।

+0

अच्छा जवाब। धन्यवाद! –

+0

शानदार! आपका बहुत बहुत धन्यवाद! ऐसा लगता है: https://gist.github.com/richardkall/5910875 – Richard

-1

मैंने जेसन को रूट जोड़ने की कोशिश की। यह मेरे लिए काम करता है:

App.Adapter = DS.RESTAdapter.extend({ 
    findAll: function(store, type, since) { 
     var root, adapter; 
      var plural; // Insert this line 
     root = this.rootForType(type); 
     adapter = this; 
      plural = this.pluralize(root); // Insert this line 
     return this.ajax(
       this.buildURL(root), 
       "GET", 
       { 
        data: this.sinceQuery(since) 
       }).then(function(json) { 
        eval ("json = {" + plural + " : json }"); // Insert this line 
        adapter.didFindAll(store, type, json); 
       }).then(null, DS.rejectionHandler); 
    } 
}); 
+4

प्रतिक्रिया में हेरफेरिंग एक धारावाहिक में है, एडाप्टर नहीं। –

15

आप इसे कुछ एम्बर में अपेक्षाकृत सामान्य कर सकते हैं।

App.PersonSerializer = DS.RESTSerializer.extend({ 
    normalizePayload: function(type, payload) { 
    var typeKey = type.typeKey; 
    return { 
     typeKey: payload 
    } 
    } 
}); 
+1

'टाइप' अब और उपलब्ध नहीं है, बस 'पेलोड'। http://emberjs.com/api/data/classes/DS.RESTSerializer।एचटीएमएल # method_normalizePayload – rog

+0

स्वीकार्य उत्तर की तुलना में जाने का यह तरीका है क्योंकि डेवलपर को पेलोड (ऐरे, सिंगल ऑब्जेक्ट) के प्रकार के बारे में चिंता करने की ज़रूरत नहीं है और उसे किसी भी स्टोर ऑपरेशन के बारे में चिंता करने की आवश्यकता नहीं है। – kiddouk

+0

यह सही विचार है, लेकिन कोड काम नहीं करता है। रिटर्न वैल्यू की चाबी सचमुच "टाइपकी" है, न कि 'var typeKey' द्वारा संग्रहीत मान। – Andrew

1

मैंने इसे DS.RESTSerializer को विस्तारित करके हल किया। सर्वर प्रतिक्रिया सरणी प्रकार है जब extractArray विधि overloaded की जरूरत है।

App.PersonSerializer = DS.RESTSerializer.extend({ 
    extractSingle: function (store, type, payload, id) { 
     var wrappedObj = {}; 
     wrappedObj[type.typeKey] = payload; 
     return this._super(store, type, wrappedObj, id); 
    }}); 
0

सबसे आसान तरीका है RESTSerializer लेकिन बहुत सरल JSONSerializer है, जो एक मूल तत्व उम्मीद नहीं है का उपयोग नहीं करने के लिए है।

समझ पर अच्छा संसाधनों जो serializer एक दिया एपीआई के लिए उपयोग करने के लिए इन दो ब्लॉग पोस्ट में पाया जा सकता है:

http://thejsguy.com/2015/12/05/which-ember-data-serializer-should-i-use.html
http://emberigniter.com/fit-any-backend-into-ember-custom-adapters-serializers/