Ember model to json

后端 未结 12 1368
北恋
北恋 2020-12-13 13:55

I am looking for an efficient way to translate my Ember object to a json string, to use it in a websocket message below

/*
 * Model
 */

App.node = Ember.Obj         


        
12条回答
  •  南笙
    南笙 (楼主)
    2020-12-13 14:44

    I modified @Kevin-pauli solution to make it works with arrays as well:

    App.Jsonable = Ember.Mixin.create({
        getJson: function() {
            var v, json = {}, inspectArray = function (aSome) {
                if (Ember.typeof(aSome) === 'array') {
                    return aSome.map(inspectArray);
                }
                if (Jsonable.detect(aSome)) {
                    return aSome.getJson();
                } 
                return aSome;
            };
            for (var key in this) {
                if (this.hasOwnProperty(key)) {
                    v = this[key];
                    if (v === 'toString') {
                        continue;
                    } 
                    if (Ember.typeOf(v) === 'function') {
                        continue;
                    }
                    if (Ember.typeOf(v) === 'array') {
                        v = v.map(inspectArray);
                    }
                    if (App.Jsonable.detect(v))
                        v = v.getJson();
                    json[key] = v;
                }
            }
            return json;
        }
    });
    

    I also made some further modification to get the best of both worlds. With the following version I check if the Jsonable object has a specific property that informs me on which of its properties should be serialized:

    App.Jsonable = Ember.Mixin.create({
        getJson: function() {
            var v, json = {}, base, inspectArray = function (aSome) {
                if (Ember.typeof(aSome) === 'array') {
                    return aSome.map(inspectArray);
                }
                if (Jsonable.detect(aSome)) {
                    return aSome.getJson();
                } 
                return aSome;
            };
            if (!Ember.isNone(this.get('jsonProperties'))) {
                // the object has a selective list of properties to inspect
                base = this.getProperties(this.get('jsonProperties'));
            } else {
                // no list given: let's use all the properties
                base = this;
            }
            for (var key in base) {
                if (base.hasOwnProperty(key)) {
                    v = base[key];
                    if (v === 'toString') {
                        continue;
                    } 
                    if (Ember.typeOf(v) === 'function') {
                        continue;
                    }
                    if (Ember.typeOf(v) === 'array') {
                        v = v.map(inspectArray);
                    }
                    if (App.Jsonable.detect(v))
                        v = v.getJson();
                    json[key] = v;
                }
            }
            return json;
        }
    });
    

    I am using this little tweak and I am happy with it. I hope it'll help others as well!

    Thanks to @pangratz and @Kevin-Pauli for their solution!

提交回复
热议问题