Adam D. Ruppe wrote: >I use std.json with a couple helper function to make it shorter. > >To use: > >writeln(toJson(whatever)); > >or > >JSONValue val = toJsonValue(whatever); > >Works on most basic data types: int, string, array, assoc, struct, >etc. > >===== > >import std.json; >import std.traits; >import std.conv; > >string toJson(T)(T a) { > auto v = toJsonValue(a); > return toJSON(&v); >} > >JSONValue toJsonValue(T)(T a) { > JSONValue val; > static if(is(T == JSONValue)) { > val = a; > } else static if(__traits(compiles, val = a.makeJsonValue())) { > val = a.makeJsonValue(); > } else static if(isIntegral!(T)) { > val.type = JSON_TYPE.INTEGER; > val.integer = to!long(a); > } else static if(isFloatingPoint!(T)) { > val.type = JSON_TYPE.FLOAT; > val.floating = to!real(a); > static assert(0); > } else static if(is(T == void*)) { > val.type = JSON_TYPE.NULL; > } else static if(is(T == bool)) { > if(a == true) > val.type = JSON_TYPE.TRUE; > if(a == false) > val.type = JSON_TYPE.FALSE; > } else static if(isSomeString!(T)) { > val.type = JSON_TYPE.STRING; > val.str = to!string(a); > } else static if(isAssociativeArray!(T)) { > val.type = JSON_TYPE.OBJECT; > foreach(k, v; a) { > val.object[to!string(k)] = toJsonValue(v); > } > } else static if(isArray!(T)) { > val.type = JSON_TYPE.ARRAY; > val.array.length = a.length; > foreach(i, v; a) { > val.array[i] = toJsonValue(v); > } > } else static if(is(T == struct)) { > val.type = JSON_TYPE.OBJECT; > > foreach(i, member; a.tupleof) { > string name = a.tupleof[i].stringof[2..$]; > static if(a.tupleof[i].stringof[2] != '_') > val.object[name] = toJsonValue(member); > } > } else { /* our catch all is to just do strings */ > val.type = JSON_TYPE.STRING; > val.str = to!string(a); > } > > return val; >} > >====
I guess you do not have similar helper functions to parse JSON? Also how do you workaround bug #2962? Maybe it doesn't occur as long as only formatting functionality is used, but any call to parseJSON triggers #2962. The bug is caused by std.conv.parse!real(string) but I'm not sure how that could be worked around. Maybe I'll have to remove floating point support and write some wrappers as you suggested, that could work. -- Johannes Pfau