Last active
October 13, 2015 06:37
-
-
Save krooked/4154244 to your computer and use it in GitHub Desktop.
Convert json object to value object(s)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
// 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);