building a simple json tree
Colin via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Jan 15 05:04:11 PST 2015
On Thursday, 15 January 2015 at 12:50:59 UTC, Rikki Cattermole
wrote:
> On 16/01/2015 1:37 a.m., anonymous wrote:
>> On Thursday, 15 January 2015 at 12:10:09 UTC, Rikki Cattermole
>> wrote:
>>> On 16/01/2015 12:16 a.m., anonymous wrote:
>>>> what's the right syntax for building a JSON tree ? I try to
>>>> do like in
>>>> an AA but the program throw because the Key doesn't exist:
>>>>
>>>> ---
>>>> import std.stdio, std.json;
>>>>
>>>> void main(string[] args)
>>>> {
>>>> struct Foo{
>>>> string a, b;
>>>> void writeToJson(ref JSONValue target) {
>>>> target["a"] = JSONValue(a);
>>>> target["b"] = JSONValue(b);
>>>> }
>>>> }
>>>>
>>>> JSONValue root = parseJSON("{}");
>>>> root["items"] = JSONValue([""]);
>>>>
>>>> Foo*[] foos;
>>>> foos ~= new Foo("a1","b1");
>>>> foos ~= new Foo("a2","b2");
>>>>
>>>> foreach(foo; foos) {
>>>> root["items"].array.length += 1;
>>>> root["items"].array[$-1] = parseJSON("{}");
>>>> foo.writeToJson(root["items"].array[$-1]);
>>>> }
>>>> }
>>>> ---
>>>
>>> import std.stdio, std.json;
>>>
>>> void main(string[] args)
>>> {
>>> struct Foo{
>>> string a, b;
>>> void writeToJson(ref JSONValue target) {
>>> target["a"] = JSONValue(a);
>>> target["b"] = JSONValue(b);
>>> }
>>> }
>>>
>>> JSONValue root = ["items": cast(string[])[]];
>>>
>>> Foo[] foos;
>>> foos ~= Foo("a1","b1");
>>> foos ~= Foo("a2","b2");
>>>
>>> foreach(foo; foos) {
>>> root["items"].array ~= JSONValue(foo.a);
>>> root["items"].array ~= JSONValue(foo.b);
>>> }
>>>
>>> writeln(root.toString());
>>> }
>>>
>>> I would recommend keeping away from std.json. Its an old
>>> piece of
>>> code, that needs to be replaced.
>>> Vibe.d has a much nicer implementation that is really decent.
>>> I would
>>> recommend that, if you are up to using the build manager dub.
>>
>> Thx, but actually I initially liked to get an array of object
>> with each
>> identifier:
>>
>> currently it produces:
>>
>> {"items":["a1","b1","a2","b2"]}
>>
>> while it'd be more desirable to have
>>
>> {"items":[{"a":"a1","b":"b1"}, {"a":"a2","b":"b2"}]}
>>
>> because the reader will test the presence of each the key "a"
>> and "b" in
>> each element of "items".
>>
>> Would it be a complete non-sense to assign an element with
>> opIndexAssign(), just like I wrote initially ? I know this is
>> wrong but
>> the syntax seemed natural and logic.
>> Reading from std.json is straightforward but writing looks a
>> bit messy.
>
> It makes sense to do it. But like I said std.json is rubbish.
> Just so you can see why I'm saying vibe.d's json implementation
> is better[0].
>
> [0]
> https://github.com/rejectedsoftware/vibe.d/blob/master/source/vibe/data/json.d#L1670
Also, look at the new std.json candidate:
http://code.dlang.org/packages/std_data_json
More information about the Digitalmars-d-learn
mailing list