A trick to control the key ordering of JSONValue.toString
Jonathan Marler
johnnymarler at gmail.com
Fri Jan 4 21:53:33 UTC 2019
On Friday, 4 January 2019 at 07:38:39 UTC, timepp wrote:
> As documented, when you output a JSONValue to string, keys are
> always in ascent order. In some case the output will be
> consumed by human so a specific key order is important.
>
> This really caused my headache for some time. When I was about
> to rewrite my own toString method I found a quick, dirty but
> clever idea as below.
>
> string toPrettyStringWithOrder(JSONValue j, string[] keys) {
> auto str = j.toString();
> for (int i = 0; i < keys.length; i++) {
> string oldkey = keys[i];
> string newkey = format("__%02d__", i) ~ oldkey;
> str = str.replace("\"" ~ oldkey ~ "\":", "\"" ~ newkey ~
> "\":");
> }
> JSONValue jj = parseJSON(str);
> str = jj.toPrettyString();
>
> auto re = regex(r"__[0-9][0-9]__","g");
> return replaceAll(str, re, "");
> }
>
> my usage:
> f.write(toPrettyStringWithOrder(j, ["name", "group", "type",
> "talent", "skill", "source", "tag", "gallary"]));
>
> It lacks of preciseness. But it's enough to me. Hope this help
> you as well.
About a year ago I had the same problem. I was able to extend
std.json with a "policy" that allowed an application to specify
custom types for json objects. Then in my application I just
defined my own object type that preserved the field order that
the json object was parsed from.
I created a Pull Request in phobos for std.json to allow
applications to specify a policy to customize json behavior
(https://github.com/dlang/phobos/pull/6059), however, Andrei
rejected the phobos PR saying that preserving field order was an
"anitpatern" in JSON (even though the phobos PR was just adding a
Policy interface, nothing to do with preserving field order) and
also saying that std.json is disliked so adding features doesn't
make any sense. Andrei tends to skim over pull requests without
understanding them and its impossible to maintain a conversation
with him to explain so I just closed the pull request so I didn't
have to deal with it.
In the end, to preserve field order I just implemented my own
simple JSON parser in 400 lines of D code:
https://github.com/marler8997/stupidjsonparser
More information about the Digitalmars-d
mailing list