Transform JSON to an appropriate format for RESTAdapter EmberJS

后端 未结 4 684
Happy的楠姐
Happy的楠姐 2020-12-18 06:20

I receive a JSON from our API that has the following format

[
  {
    \"id\": 45,
    \"name\": \"Pasta\",
    \"_order\": 0,
    \"is_hidden\": null,
    \         


        
相关标签:
4条回答
  • 2020-12-18 06:35

    In general, you'll probably want to implement a couple of methods in your serializer if you have to tweak your JSON:

    App.ApplicationSerializer = DS.RESTSerializer.extend({
        normalize: function(type, hash, prop) {
            // change your incoming JSON to ember-style here
        },
        serialize: function(record, options) {
            // change your outgoing ember-data record to your server's JSON here
        }
    });
    

    EDIT: You may also in your case need to override extractArray as well: http://emberjs.com/api/data/classes/DS.RESTSerializer.html#method_extractArray

    0 讨论(0)
  • 2020-12-18 06:40

    Just nest the object represented by your JSON string inside a new object which adds the new property needed and then convert back to JSON. Like this:

    var yourInitialJSONString; // your JSON from API 
    var obj = JSON.parse(yourInitialJSONString);
    var newObj = {
        category: obj
    };
    var finalJSON = JSON.stringify(newObj);
    

    Alternatively, though probably only best for simple case and not as universally useful as working with actual objects, you could simply concatenate to your JSON:

    var yourInitialJSONString; // your JSON from API
    var finalJSON = '{"category":' + yourInitialJSONString + '}';
    

    These might prove faster for simple use cases as you avoid deserialization and serialization. I just don't like it as much as I would rather work with actual objects represented by the data. If you need to do a more complex transformation it would probably prove to be more understandable in real word terms than doing a bunch of string concatenation/manipulation.

    0 讨论(0)
  • 2020-12-18 06:49

    I ran into this issue earlier today. A nice clean way to fix it is to define a normalizePayload method for your ApplicationSerializer. It's made to be overwritten, so you aren't affecting anything else.

    E.g.

    App.ApplicationSerializer = DS.RESTSerializer.extend({
        normalizePayload: function(type, payload) {
            return { category: payload };
        }
    }
    

    If you want to do this on only some of the payloads processed then you just add a conditional inside it.

    App.ApplicationSerializer = DS.RESTSerializer.extend({
        normalizePayload: function(type, payload) {
            if (type.toString() === 'App.Category') {
                return { category: payload };
            }
        }
    }
    

    For more info on the normalizePayload method see http://emberjs.com/api/data/classes/DS.RESTSerializer.html#method_normalizePayload

    0 讨论(0)
  • 2020-12-18 07:01

    Neither normalizePayload nor normalize is working for me. What I am doing is:

    // app/serializers/application.js
    import DS from 'ember-data';
    
    export default DS.RESTSerializer.extend({
        extractArray: function(store, type, payload) {
            var payloadTemp = {}
            payloadTemp[type.typeKey] = payload;
            return this._super(store, type, payloadTemp);
        },
        extractSingle: function(store, type, payload, id) {
            var payloadTemp = {}
            payloadTemp[type.typeKey] = [payload];
            return this._super(store, type, payloadTemp, id);
        }
    });
    
    0 讨论(0)
提交回复
热议问题