Skip to content

Instantly share code, notes, and snippets.

@krooked
Last active October 13, 2015 06:37
Show Gist options
  • Save krooked/4154244 to your computer and use it in GitHub Desktop.
Save krooked/4154244 to your computer and use it in GitHub Desktop.
Convert json object to value object(s)
/**
* Actionscript
* Json to value object converter
*
* @author André Niet
* @version 0.1
*/
package util {
import flash.utils.Dictionary;
import flash.utils.describeType;
public class JsonConverter {
// Json attribute for the actionscript class name
public static var CLASS_ATTRIBUTE:String = "__class__";
// A dictionary to store the class mappings
private static var CLASS_MAPPING:Dictionary = new Dictionary();
/**
* Register class
* @param alias The class name given in the json object
* @param clazz The actionscript class that is mapped to the alias
*/
public static function registerClass(alias:String, clazz:Class):void {
CLASS_MAPPING[alias] = clazz;
}
/**
* Convert the json object
* @param obj The json object
* @return The converted object
*/
public static function convertObject(obj:Object):Object {
return _createObject(obj);
}
/**
* Check whether object is an array or has a class mapping
* @param obj Object
* @return Object
*/
private static function _createObject(obj:Object):Object {
if (obj == null) {
return null;
}
if (obj is Array) {
_createArray(obj as Array);
} else if (objectHasClassMapping(obj)) {
obj = _createClass(obj);
}
return _iterateObject(obj);
}
/**
* Iterate over the object attributes
* @param obj Object
* @return Object
*/
private static function _iterateObject(obj:Object):Object {
for (var i:String in obj) {
obj[i] = _createObject(obj[i]);
}
return obj;
}
/**
* Create array
* @param array Array
*/
private static function _createArray(array:Array):void {
for (var j:int = 0; j < array.length; j++) {
array[j] = _createObject(array[j]);
}
}
/**
* Create the concrete value object class
* @param obj Raw json data
* @return The concrete value object class
*/
private static function _createClass(obj:Object):Object {
var clazz:Class = CLASS_MAPPING[obj[CLASS_ATTRIBUTE]];
var result:Object = new clazz();
var describeTypeXML:XML = describeType(clazz);
for each (var variable: XML in describeTypeXML..variable) {
result[variable.@name] = _createObject(obj[variable.@name]);
}
return result;
}
/**
* Check if object has class mapping
* @param obj Object
* @return true if object has class mapping, false if not
*/
private static function objectHasClassMapping(obj:Object):Boolean {
return obj.hasOwnProperty(CLASS_ATTRIBUTE);
}
}
}
@krooked
Copy link
Author

krooked commented Nov 27, 2012

// Example:
JSONObject =
{
"class": "RootVO",
"varString": "top level object",
"varArray": [{"item1": "item1Value"},{"item2": "item2Value"}],
"myVO": {
"class": "MyVO",
"varArray": [{
"class": "MyVO2",
"varString": "stringValue"
}],
"varString": "stringValue",
"varNumber": 10,
"varObject": {
"varString": "varString"
},
"myVO2": {
"class": "MyVO2",
"varString": "stringValue"
}
}
};

// Register your value object classes
MyJsonConverter.registerClass("RootVO", RootVO);
MyJsonConverter.registerClass("MyVO", MyVO);
MyJsonConverter.registerClass("MyVO2", MyVO2);
//Convert data
var vo:RootVO = MyJsonConverter.convertObject(JSONObject);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment