painlessjson.painlessjson

  • Declaration

    JSONValue defaultToJSON(T, SerializationOptions options = defaultSerializatonOptions)(in T t);

    Convert any type to JSON
    Can be overridden by _toJSON

  • Declaration

    JSONValue toJSON(T, SerializationOptions options = defaultSerializatonOptions)(in T t);

    Template function that converts any object to JSON

    Examples

    Converting common types

    1. assertEqual(5.toJSON!int, JSONValue(5)); assert(4.toJSON != JSONValue(5)); //TODO: Wait for DUnit to implement assertNotEqual assertEqual(5.4.toJSON, JSONValue(5.4)); assertEqual(toJSON("test"), JSONValue("test")); assertEqual(toJSON(JSONValue("test")), JSONValue("test"));

    Examples

    Converting InputRanges

    1. assertEqual([1, 2].toJSON.toString, "[1,2]");

    Examples

    User structs

    1. Point p; assertEqual(toJSON(p).toString, q{{"x":0,"y":1}});

    Examples

    Array of structs

    1. Point[] ps = [Point(-1, 1), Point(2, 3)]; assertEqual(toJSON(ps).toString, q{[{"x":-1,"y":1},{"x":2,"y":3}]});

    Examples

    User class

    1. PointC p = new PointC(1, -2); assertEqual(toJSON(p).toString, q{{"x":1,"y":-2}});

    Examples

    User class with private fields

    1. PointPrivate p = new PointPrivate(-1, 2); assertEqual(toJSON(p).toString, q{{"x":-1,"y":2}}); auto pnt = p.toJSON.fromJSON!PointPrivate; assertEqual(p.x, -1); assertEqual(p.y, 2);

    Examples

    User class with defaultToJSON

    1. PointDefaultFromJSON p = new PointDefaultFromJSON(-1, 2); assertEqual(toJSON(p).toString, q{{"_x":-1,"y":2}}); auto pnt = p.toJSON.fromJSON!PointDefaultFromJSON; assertEqual(p.x, -1); assertEqual(p.y, 2);

    Examples

    User class with private fields and @property

    1. auto p = PointPrivateProperty(-1, 2); assertEqual(toJSON(p).toString, q{{"x":-1,"y":2,"z":1}});

    Examples

    User class with SerializedName annotation

    1. auto p = PointSerializationName(-1, 2); assertEqual(toJSON(p)["xOut"].floating, -1); assertEqual(toJSON(p)["yOut"].floating, 2);

    Examples

    User class with SerializeIgnore annotations

    1. auto p = PointSerializationIgnore(-1, 5, 4); assertEqual(toJSON(p).toString, q{{"z":5}});

    Examples

    Array of classes

    1. PointC[] ps = [new PointC(-1, 1), new PointC(2, 3)]; assertEqual(toJSON(ps).toString, q{[{"x":-1,"y":1},{"x":2,"y":3}]});

    Examples

    Associative array

    1. string[int] aa = [0 : "a", 1 : "b"]; assert(aa.toJSON.toString == q{{"0":"a","1":"b"}}); Point[int] aaStruct = [0 : Point(-1, 1), 1 : Point(2, 0)]; assertEqual(aaStruct.toJSON.toString, q{{"0":{"x":-1,"y":1},"1":{"x":2,"y":0}}}); assertEqual(["key": "value"].toJSON.toString, q{{"key":"value"}});

    Examples

    Associative array containing struct

    1. assertEqual(["test": SimpleStruct("test2")].toJSON().toString, q{{"test":{"str":"test2"}}});

    Examples

    Associative array with struct key

    1. assertEqual([SimpleStruct("key"): "value", SimpleStruct("key2"): "value2"].toJSON().toString, q{{"{\"str\":\"key\"}":"value","{\"str\":\"key2\"}":"value2"}});

    Examples

    struct with inner struct and AA

    1. auto testStruct = StructWithStructAndAA(["key1": "value1"], ["key2": StructWithStructAndAA.Inner("value2")]); auto converted = testStruct.toJSON(); assertEqual(converted["stringToInner"].toString, q{{"key2":{"str":"value2"}}}); assertEqual(converted["stringToString"].toString, q{{"key1":"value1"}});

    Examples

    Unnamed tuples

    1. Tuple!(int, int) point; point[0] = 5; point[1] = 6; assertEqual(toJSON(point).toString, q{{"_0":5,"_1":6}});

    Examples

    Named tuples

    1. Tuple!(int, "x", int, "y") point; point.x = 5; point.y = 6; assertEqual(point, fromJSON!(Tuple!(int, "x", int, "y"))(parseJSON(q{{"x":5,"y":6}})));

    Examples

    Convert camel case to underscore automatically

    1. CamelCaseConversion value; value.wasCamelCase = 5; value.was_underscore = 7; auto valueAsJSON = value.toJSON!(CamelCaseConversion,SerializationOptions(false, true)); assertEqual(valueAsJSON["was_camel_case"].integer, 5); assertEqual(valueAsJSON["was_underscore"].integer, 7);

    Examples

    Overloaded toJSON

    1. class A { double x = 0; double y = 1; JSONValue toJSON() { JSONValue[string] json; json["x"] = x; return JSONValue(json); } } auto a = new A; assertEqual(a.toJSON.toString, q{{"x":0}}); class B { double x = 0; double y = 1; } // Both templates will now work for B, so this is ambiguous in D. // Under dmd it looks like the toJSON!T that is loaded first is the one used JSONValue toJSON(T : B)(T b) { JSONValue[string] json; json["x"] = b.x; return JSONValue(json); } auto b = new B; assertEqual(b.toJSON.toString, q{{"x":0,"y":1}}); class Z { double x = 0; double y = 1; // Adding an extra value JSONValue toJSON() { JSONValue[string] json = painlessjson.toJSON!Z(this).object; json["add"] = "bla".toJSON; return JSONValue(json); } } auto z = new Z; assertEqual(z.toJSON["x"].floating, 0); assertEqual(z.toJSON["y"].floating, 1); assertEqual(z.toJSON["add"].str, "bla");

  • Declaration

    T defaultFromJSON(T, SerializationOptions options = defaultSerializatonOptions)(in JSONValue json);

    Convert to given type from JSON.
    Can be overridden by _fromJSON.

  • Declaration

    T fromJSON(T, SerializationOptions options = defaultSerializatonOptions)(in JSONValue json);

    Convert from JSONValue to any other type

    Examples

    Converting common types

    1. assertEqual(fromJSON!int(JSONValue(1)), 1); assertEqual(fromJSON!double(JSONValue(1.0)), 1); assertEqual(fromJSON!double(JSONValue(1.3)), 1.3); assertEqual(fromJSON!string(JSONValue("str")), "str"); assertEqual(fromJSON!bool(JSONValue(true)), true); assertEqual(fromJSON!bool(JSONValue(false)), false); assertEqual(fromJSON!JSONValue(JSONValue(true)), JSONValue(true));

    Examples

    Converting arrays

    1. assertEqual(fromJSON!(int[])(toJSON([1, 2])), [1, 2]); assertEqual(fromJSON!(Point[])(parseJSON(q{[{"x":-1,"y":2},{"x":3,"y":4}]})), [Point(-1,2),Point(3,4)]);

    Examples

    Array as member of other class

    1. // Types need to be defined in different module, otherwise // type is not known at compile time import painlessjson.unittesttypes_local_import; string jsonString = q{[ {"duration": "10"} ]}; Route[] routes = parseJSON(jsonString).fromJSON!(Route[]); assertEqual(routes.length, 1); jsonString = q{{"routes":[ {"duration": "10"} ] }}; JourneyPlan jp; jp = parseJSON(jsonString).fromJSON!JourneyPlan; assertEqual(jp.routes.length, 1);

    Examples

    Associative arrays

    1. string[int] aaInt = [0 : "a", 1 : "b"]; assertEqual(aaInt, fromJSON!(string[int])(parseJSON(q{{"0" : "a", "1": "b"}}))); string[string] aaString = ["hello" : "world", "json" : "painless"]; assertEqual(aaString, fromJSON!(string[string])(parseJSON(q{{"hello" : "world", "json" : "painless"}})));

    Examples

    Associative array containing struct

    1. auto parsed = fromJSON!(SimpleStruct[string])(parseJSON(q{{"key": {"str": "value"}}})); assertEqual(parsed , ["key": SimpleStruct("value")]);

    Examples

    Associative array with struct key

    1. JSONValue value = parseJSON(q{{"{\"str\":\"key\"}":"value", "{\"str\":\"key2\"}":"value2"}}); auto parsed = fromJSON!(string[SimpleStruct])(value); assertEqual( parsed , [SimpleStruct("key"): "value", SimpleStruct("key2"): "value2"]);

    Examples

    struct with inner struct and AA

    1. auto testStruct = StructWithStructAndAA(["key1": "value1"], ["key2": StructWithStructAndAA.Inner("value2")]); auto testJSON = parseJSON(q{{"stringToInner":{"key2":{"str":"value2"}},"stringToString":{"key1":"value1"}}}); assertEqual(fromJSON!StructWithStructAndAA(testJSON), testStruct);

    Examples

    Error reporting from inner objects

    1. import std.exception : collectExceptionMsg; import std.algorithm : canFind; void throwFunc() { fromJSON!(string[SimpleStruct])(parseJSON(q{{"{\"str\": \"key1\"}": "value", "key2":"value2"}})); } auto errorMessage = collectExceptionMsg(throwFunc()); assert(errorMessage.canFind("key2")); assert(errorMessage.canFind("string[SimpleStruct]")); assert(!errorMessage.canFind("key1"));

    Examples

    Structs from JSON

    1. auto p = fromJSON!Point(parseJSON(q{{"x":-1,"y":2}})); assertEqual(p.x, -1); assertEqual(p.y, 2); p = fromJSON!Point(parseJSON(q{{"x":2}})); assertEqual(p.x, 2); assertEqual(p.y, 1); p = fromJSON!Point(parseJSON(q{{"y":3}})); assertEqual(p.x, 0); assertEqual(p.y, 3); p = fromJSON!Point(parseJSON(q{{"x":-1,"y":2,"z":3}})); assertEqual(p.x, -1); assertEqual(p.y, 2);

    Examples

    Class from JSON

    1. auto p = fromJSON!PointC(parseJSON(q{{"x":-1,"y":2}})); assertEqual(p.x, -1); assertEqual(p.y, 2);

    Examples

    Convert class from JSON using "fromJSON"

    1. auto p = fromJSON!PointPrivate(parseJSON(q{{"x":-1,"y":2}})); assertEqual(p.x, -1); assertEqual(p.y, 2);

    Examples

    Convert struct from JSON using properties

    1. auto p = fromJSON!PointPrivateProperty(parseJSON(q{{"x":-1,"y":2,"z":3}})); assertEqual(p.x, -1); assertEqual(p.y, 2);

    Examples

    User class with SerializedName annotation

    1. auto p = fromJSON!PointSerializationName(parseJSON(q{{"xOut":-1,"yOut":2}})); assertEqual(p.x, 2); assertEqual(p.y, -1);

    Examples

    User class with SerializeIgnore annotations

    1. auto p = fromJSON!PointSerializationIgnore(parseJSON(q{{"z":15}})); assertEqual(p.x, 0); assertEqual(p.y, 1); assertEqual(p.z, 15);

    Examples

    Unnamed tuples

    1. Tuple!(int, int) point; point[0] = 5; point[1] = 6; assertEqual(point, fromJSON!(Tuple!(int, int))(parseJSON(q{{"_0":5,"_1":6}})));

    Examples

    No default constructor

    1. auto p = fromJSON!PointUseConstructor(parseJSON(q{{"x":2, "y":5}})); assertEqual(p.x, 2); assertEqual(p.y, 5);

    Examples

    Multiple constructors and all JSON-values are there

    1. auto person = fromJSON!IdAndName(parseJSON(q{{"id":34, "name": "Jason Pain"}})); assertEqual(person.id, 34); assertEqual(person.name, "Jason Pain");

    Examples

    Multiple constructors and some JSON-values are missing

    1. auto person = fromJSON!IdAndName(parseJSON(q{{"id":34}})); assertEqual(person.id, 34); assertEqual(person.name, "Undefined");

    Examples

    Accept underscore and convert it to camelCase automatically

    1. auto value = fromJSON!CamelCaseConversion(parseJSON(q{{"was_camel_case":8,"was_underscore":9}})); assertEqual(value.wasCamelCase, 8); assertEqual(value.was_underscore, 9);