| @system unittest | |
| { | |
| import std.json; | |
| import std.conv : to; | |
| // parse a file or string of json into a usable structure | |
| string s = `{ "language": "D", "rating": 3.5, "code": "42" }`; | |
| JSONValue j = parseJSON(s); | |
| // j and j["language"] return JSONValue, | |
| // j["language"].str returns a string | |
| assert(j["language"].str == "D"); | |
| assert(j["rating"].floating == 3.5); | |
| // check a type | |
| long x; | |
| if (const(JSONValue)* code = "code" in j) | |
| { | |
| if (code.type() == JSONType.integer) | |
| x = code.integer; | |
| else | |
| x = to!int(code.str); | |
| } | |
| // create a json struct | |
| JSONValue jj = [ "language": "D" ]; | |
| // rating doesnt exist yet, so use .object to assign | |
| jj.object["rating"] = JSONValue(3.5); | |
| // create an array to assign to list | |
| jj.object["list"] = JSONValue( ["a", "b", "c"] ); | |
| // list already exists, so .object optional | |
| jj["list"].array ~= JSONValue("D"); | |
| string jjStr = `{"language":"D","list":["a","b","c","D"],"rating":3.5}`; | |
| assert(jj.toString == jjStr); | |
| } | |
| @safe unittest | |
| { | |
| import std.json; | |
| string s = "{ \"language\": \"D\" }"; | |
| JSONValue j = parseJSON(s); | |
| assert(j.type == JSONType.object); | |
| assert(j["language"].type == JSONType.string); | |
| } | |
| @safe unittest | |
| { | |
| import std.json; | |
| JSONValue j = [ "language": "D" ]; | |
| // get value | |
| assert(j["language"].str == "D"); | |
| // change existing key to new string | |
| j["language"].str = "Perl"; | |
| assert(j["language"].str == "Perl"); | |
| } | |
| @safe unittest | |
| { | |
| import std.json; | |
| JSONValue j = true; | |
| assert(j.boolean == true); | |
| j.boolean = false; | |
| assert(j.boolean == false); | |
| j.integer = 12; | |
| import std.exception : assertThrown; | |
| assertThrown!JSONException(j.boolean); | |
| } | |
| @safe unittest | |
| { | |
| import std.json; | |
| import std.exception; | |
| import std.conv; | |
| string s = | |
| `{ | |
| "a": 123, | |
| "b": 3.1415, | |
| "c": "text", | |
| "d": true, | |
| "e": [1, 2, 3], | |
| "f": { "a": 1 }, | |
| "g": -45, | |
| "h": ` ~ ulong.max.to!string ~ `, | |
| }`; | |
| struct a { } | |
| immutable json = parseJSON(s); | |
| assert(json["a"].get!double == 123.0); | |
| assert(json["a"].get!int == 123); | |
| assert(json["a"].get!uint == 123); | |
| assert(json["b"].get!double == 3.1415); | |
| assertThrown!JSONException(json["b"].get!int); | |
| assert(json["c"].get!string == "text"); | |
| assert(json["d"].get!bool == true); | |
| assertNotThrown(json["e"].get!(JSONValue[])); | |
| assertNotThrown(json["f"].get!(JSONValue[string])); | |
| static assert(!__traits(compiles, json["a"].get!a)); | |
| assertThrown!JSONException(json["e"].get!float); | |
| assertThrown!JSONException(json["d"].get!(JSONValue[string])); | |
| assertThrown!JSONException(json["f"].get!(JSONValue[])); | |
| assert(json["g"].get!int == -45); | |
| assertThrown!ConvException(json["g"].get!uint); | |
| assert(json["h"].get!ulong == ulong.max); | |
| assertThrown!ConvException(json["h"].get!uint); | |
| assertNotThrown(json["h"].get!float); | |
| } | |
| @safe unittest | |
| { | |
| import std.json; | |
| JSONValue j = JSONValue( "a string" ); | |
| j = JSONValue(42); | |
| j = JSONValue( [1, 2, 3] ); | |
| assert(j.type == JSONType.array); | |
| j = JSONValue( ["language": "D"] ); | |
| assert(j.type == JSONType.object); | |
| } | |
| @system unittest | |
| { | |
| import std.json; | |
| JSONValue obj1 = JSONValue.emptyObject; | |
| assert(obj1.type == JSONType.object); | |
| obj1.object["a"] = JSONValue(1); | |
| assert(obj1.object["a"] == JSONValue(1)); | |
| JSONValue obj2 = JSONValue.emptyObject; | |
| assert("a" !in obj2.object); | |
| obj2.object["b"] = JSONValue(5); | |
| assert(obj1 != obj2); | |
| } | |
| @system unittest | |
| { | |
| import std.json; | |
| JSONValue obj = JSONValue.emptyOrderedObject; | |
| assert(obj.type == JSONType.object); | |
| assert(obj.isOrdered); | |
| obj["b"] = JSONValue(2); | |
| obj["a"] = JSONValue(1); | |
| assert(obj["a"] == JSONValue(1)); | |
| assert(obj["b"] == JSONValue(2)); | |
| string[] keys; | |
| foreach (string k, JSONValue v; obj) | |
| keys ~= k; | |
| assert(keys == ["b", "a"]); | |
| } | |
| @system unittest | |
| { | |
| import std.json; | |
| JSONValue arr1 = JSONValue.emptyArray; | |
| assert(arr1.type == JSONType.array); | |
| assert(arr1.array.length == 0); | |
| arr1.array ~= JSONValue("Hello"); | |
| assert(arr1.array.length == 1); | |
| assert(arr1.array[0] == JSONValue("Hello")); | |
| JSONValue arr2 = JSONValue.emptyArray; | |
| assert(arr2.array.length == 0); | |
| assert(arr1 != arr2); | |
| } | |
| @safe unittest | |
| { | |
| import std.json; | |
| JSONValue j = JSONValue( [42, 43, 44] ); | |
| assert( j[0].integer == 42 ); | |
| assert( j[1].integer == 43 ); | |
| } | |
| @safe unittest | |
| { | |
| import std.json; | |
| JSONValue j = JSONValue( ["language": "D"] ); | |
| assert( j["language"].str == "D" ); | |
| } | |
| @safe unittest | |
| { | |
| import std.json; | |
| JSONValue j = JSONValue( ["language": "D"] ); | |
| j["language"].str = "Perl"; | |
| assert( j["language"].str == "Perl" ); | |
| } | |
| @safe unittest | |
| { | |
| import std.json; | |
| JSONValue j = JSONValue( ["Perl", "C"] ); | |
| j[1].str = "D"; | |
| assert( j[1].str == "D" ); | |
| } | |
| @safe unittest | |
| { | |
| import std.json; | |
| JSONValue j = [ "language": "D", "author": "walter" ]; | |
| string a = ("author" in j).str; | |
| *("author" in j) = "Walter"; | |
| assert(j["author"].str == "Walter"); | |
| } | |
| @safe unittest | |
| { | |
| import std.json; | |
| assert(JSONValue(10).opEquals(JSONValue(10.0))); | |
| assert(JSONValue(10) != (JSONValue(10.5))); | |
| assert(JSONValue(1) != JSONValue(true)); | |
| assert(JSONValue.emptyArray != JSONValue.emptyObject); | |
| assert(parseJSON(`{"a": 1, "b": 2}`).opEquals(parseJSON(`{"b": 2, "a": 1}`))); | |
| } | |