Skip to content

Instantly share code, notes, and snippets.

@miltoncandelero
Last active July 3, 2018 12:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save miltoncandelero/78b43a88b51a43a719eed1dd98b9756f to your computer and use it in GitHub Desktop.
Save miltoncandelero/78b43a88b51a43a719eed1dd98b9756f to your computer and use it in GitHub Desktop.
Creates typedefs based on a json example variable.
import haxe.Json;
/**
* Toss a Dynamic var and get a typedef declaration! (Inspired by http://json2csharp.com)
* (A bit of code stolen from https://gist.github.com/elsassph/16d3b2597f6a51b5817c2fa97dd7f505)
* @author Milton Candelero (Elemental Code)
*/
class JsonClass
{
public function new() { }
private static var typedefArray:Array<String>;
public static function makeFromJson(json:String,name:String = "Root"):String
{
return makeFromDynamic(Json.parse(json), name);
}
public static function makeFromDynamic(obj:Dynamic,name:String = "Root"):String
{
typedefArray = new Array<String>();
typedefArray.push(makeSubClass(obj, name));
// final return.
var retval:String = "";
for (i in typedefArray)
{
retval += i + "\n \n";
}
return retval;
}
private static function makeSubClass(json:Dynamic,name:String) :String
{
var list:String = "";
for (i in makeFields(json, name))
{
list += i + "\n";
}
return "typedef " + name + " = {\n" + list +"}";
}
static function makeFields(obj:Dynamic, pc:String):Array<String>
{
return [
for (prop in Reflect.fields(obj))
makeField(prop, Reflect.getProperty(obj, prop), pc)
];
}
static function makeField(prop:String, value:Dynamic, pc:String):String
{
var valueType:String = makeType(value);
if (valueType == "Typedef") {
valueType = pc+"_"+prop;
typedefArray.push(makeSubClass(value, valueType));
}
if (valueType == "Array<Typedef>") {
valueType = "Array<"+pc+"_"+prop+">";
typedefArray.push(makeSubClass(value[0], pc+"_"+prop));
}
prop = safeFieldName(prop);
if (valueType == "Null" || valueType.indexOf("<Null>")!=-1) {
return "\t//var " + prop + " : " + valueType +"; //Couldn't Guess Type. Sorry. :/";
}
return "\tvar " + prop + " : " + valueType +";";
}
static function makeType(value:Dynamic):String
{
if (value == null) return "Null";
if (Std.is(value, String)) return "String";
if (Std.is(value, Int)) return "Int";
if (Std.is(value, Float)) return "Float";
if (Std.is(value, Bool)) return "Bool";
if (Std.is(value, Array)) return "Array<"+makeType(value[0])+">";
return "Typedef";
}
static function safeFieldName(prop:String)
{
var c = prop.charCodeAt(0);
if (c >= "0".code && c <= "9".code) return "_" + prop;
return prop;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment