import std.json, std.traits, std.conv;
import std.stdio : writeln;
auto json = serialise(Person("Bradley", 20));
writeln("As JSON: ", json);
auto person = deserialise!Person(json);
writeln("As Person: ", person);
enum isPrimitiveType(T) = isNumeric!T || is(T == bool) || is(T == string);
JSONValue serialise(T)(T value)
static if(isPrimitiveType!T)
else static if(is(T == struct))
static foreach(member; T.tupleof)
alias MemberType = typeof(member);
const MemberName = __traits(identifier, member);
MemberType memberValue = mixin("value." ~ MemberName);
toReturn[MemberName] = serialise(memberValue);
static assert(false, "Don't know how to serialise type: " ~ T.stringof);
T deserialise(T)(JSONValue json)
static if(is(T == string))
else static if(is(T == bool))
else static if(isFloatingPoint!T)
return json.floating.to!T();
else static if(isSigned!T)
return json.integer.to!T();
else static if(isUnsigned!T)
return json.uinteger.to!T();
else static if(is(T == struct))
static foreach(member; T.tupleof)
alias MemberType = typeof(member);
const MemberName = __traits(identifier, member);
MemberType memberValue = deserialise!MemberType(json[MemberName]);
mixin("toReturn." ~ MemberName ~ " = memberValue;");
static assert(false, "Don't know how to deserialise type: " ~ T.stringof);