YUI Library JavaScript DHTML





    
Rebuilding class instances from JSON data

/*margin and padding on body element
  can introduce errors in determining
  element position and are not recommended;
  we turn them off as a foundation for YUI
  CSS treatments. */
body {
  margin:0;
  padding:0;
}






#demo textarea {
    background: #fff;
    border: 1px solid #ccc;
    display: block;
    margin: 1em;
    padding: 1em;
    width: 80%;
    height: 50px;
}




Rebuilding class instances from JSON data



  

This example illustrates one method of serializing and recreating class instances by using the replacer and reviver parameters to JSON.stringify and JSON.parse respectively.


      



    Freeze
    Thaw
    (stringify results here)
    



YAHOO.util.Event.onDOMReady(function () {
var Event = YAHOO.util.Event,
    Dom   = YAHOO.util.Dom,
    JSON  = YAHOO.lang.JSON,
    Demo;
    
Demo = YAHOO.namespace('demo').FreezeThaw = {
    data       : null,
    jsonString : null,
    cryo : function (k,o) {
        return (o instanceof CaveMan) ? CaveMan.freeze(o) : o;
    },
    revive : function (k,v) {
        // Turn anything that looks like a UTC date string into a Date instance
        if (typeof v === 'string') {
            return JSON.stringToDate(v);;
        }
        // Check for cavemen by the _class key
        if (v instanceof Object && v._class == 'CaveMan') {
            return CaveMan.thaw(v);
        }
        // default to returning the value unaltered
        return v;
    }
};
function CaveMan(name,discovered) {
    this.name       = name;
    this.discovered = discovered;
};
CaveMan.prototype.getName = function () {
    return this.name + ", the cave man";
}
// Static methods to convert to and from a basic object structure
CaveMan.thaw = function (o) {
    return new CaveMan(o.n, o.d);
};
// Convert to a basic object structure including a class identifier
CaveMan.freeze = function (cm) {
    return {
        _class : 'CaveMan',
        n : cm.name,
        d : cm.discovered // remains a Date for standard JSON serialization
    };
};
Demo.data    = {
    count : 1,
    type  : 'Hominid',
    specimen : [
        new CaveMan('Ed',new Date(1946,6,6))
    ]
};
Event.on('demo_freeze','click',function (e) {
    Demo.jsonString = JSON.stringify(Demo.data, Demo.cryo);
    Dom.get('demo_frozen').value = Demo.jsonString;
    Dom.get('demo_thaw').disabled = false;
});
Event.on('demo_thaw','click',function (e) {
    var parsedData = JSON.parse(Demo.jsonString, Demo.revive);
        cm = parsedData.specimen[0];
    Dom.get('demo_thawed').innerHTML =
        "

Specimen count: " + parsedData.count + "

"+
        "

Specimen type: " + parsedData.type + "

"+
        "

Instanceof CaveMan: " + (cm instanceof CaveMan) + "

"+
        "

Name: " + cm.getName() + "

"+
        "

Discovered: " + cm.discovered + "

";
});
});





   
  
yui_2.7.0b.zip( 4,431 k)