std.jgrandson
Andrea Fontana via Digitalmars-d
digitalmars-d at puremagic.com
Mon Aug 4 00:47:53 PDT 2014
On Sunday, 3 August 2014 at 07:16:05 UTC, Andrei Alexandrescu
wrote:
> We need a better json library at Facebook. I'd discussed with
> Sönke the possibility of taking vibe.d's json to std but he
> said it needs some more work. So I took std.jgrandson to proof
> of concept state and hence ready for destruction:
>
> http://erdani.com/d/jgrandson.d
> http://erdani.com/d/phobos-prerelease/std_jgrandson.html
>
> Here are a few differences compared to vibe.d's library. I
> think these are desirable to have in that library as well:
>
> * Parsing strings is decoupled into tokenization (which is lazy
> and only needs an input range) and parsing proper. Tokenization
> is lazy, which allows users to create their own advanced (e.g.
> partial/lazy) parsing if needed. The parser itself is eager.
>
> * There's no decoding of strings.
>
> * The representation is built on Algebraic, with the advantages
> that it benefits from all of its primitives. Implementation is
> also very compact because Algebraic obviates a bunch of
> boilerplate. Subsequent improvements to Algebraic will also
> reflect themselves into improvements to std.jgrandson.
>
> * The JSON value (called std.jgrandson.Value) has no named
> member variables or methods except for __payload. This is so
> there's no clash between dynamic properties exposed via
> opDispatch.
>
> Well that's about it. What would it take for this to become a
> Phobos proposal? Destroy.
>
>
> Andrei
On my bson library I found very useful to have some methods to
know if a field exists or not, and to get a "defaulted" value.
Something like:
auto assume(T)(Value v, T default = T.init);
Another good method could be something like xpath to get a deep
value:
Value v = value["/path/to/sub/object"];
Moreover in my library I actually have three different methods to
read a value:
T get(T)() // Exception if value is not a T or not valid or value
doesn't exist
T to(T)() // Try to convert value to T using to!string.
Exception if doesn't exists or not valid
BsonField!T as(T)(lazy T default = T.init) // Always return a
value
BsonField!T is an "alias this"-ed struct with two fields: T value
and bool error(). T value is the aliased field, and error() tells
you if value is defaulted (because of an error: field not exists
or can't convert to T)
So I can write something like this:
int myvalue = json["/that/deep/property"].as!int;
or
auto myvalue = json["/that/deep/property"].as!int(10);
if (myvalue.error) writeln("Property doesn't exists, I'm using
default value);
writeln("Property value: ", myvalue);
I hope this can be useful...
More information about the Digitalmars-d
mailing list