building a simple json tree

anonymous via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jan 15 04:37:41 PST 2015


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.


More information about the Digitalmars-d-learn mailing list