Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
January 15, 2015 building a simple json tree | ||||
---|---|---|---|---|
| ||||
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]); } } --- |
January 15, 2015 Re: building a simple json tree | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | 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.
|
January 15, 2015 Re: building a simple json tree | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rikki Cattermole | 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. |
January 15, 2015 Re: building a simple json tree | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | 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 |
January 15, 2015 Re: building a simple json tree | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rikki Cattermole | 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 |
Copyright © 1999-2021 by the D Language Foundation