std.data.json formal review
Sönke Ludwig via Digitalmars-d
digitalmars-d at puremagic.com
Tue Aug 11 14:06:22 PDT 2015
Am 11.08.2015 um 19:30 schrieb deadalnix:
> Ok some actionable items.
>
> 1/ How big is a JSON struct ? What is the biggest element in the union ?
> Is that element really needed ? Recurse.
See
http://s-ludwig.github.io/std_data_json/stdx/data/json/value/JSONValue.payload.html
The question whether each field is "really" needed obviously depends on
the application. However, the biggest type is BigInt that, form a quick
look, contains a dynamic array + a bool field, so it's not as compact as
it could be, but also not really large. There is also an additional
Location field that may sometimes be important for good error messages
and the like and sometimes may be totally unneeded.
However, my goal when implementing this has never been to make the DOM
representation as efficient as possible. The simple reason is that a DOM
representation is inherently inefficient when compared to operating on
the structure using either the pull parser or using a deserializer that
directly converts into a static D type. IMO these should be advertised
instead of trying to milk a dead cow (in terms of performance).
> 2/ As far as I can see, the element are discriminated using typeid. An
> enum is preferable as the compiler would know values ahead of time and
> optimize based on this. It also allow use of things like final switch.
Using a tagged union like structure is definitely what I'd like to have,
too. However, the main goal was to build the DOM type upon a generic
algebraic type instead of using a home-brew tagged union. The reason is
that it automatically makes different DOM types with a similar structure
interoperable (JSON/BSON/TOML/...).
Now Phobos unfortunately only has Algebraic, which not only doesn't have
a type enum, but is currently also really bad at keeping static type
information when forwarding function calls or operators. The only
options were basically to resort to Algebraic for now, but have
something that works, or to first implement an alternative algebraic
type and get it accepted into Phobos, which would delay the whole
process nearly indefinitely.
> 3/ Going from the untyped world to the typed world and provide an API to
> get back to the untyped word is a loser strategy. That sounds true
> intuitively, but also from my experience manipulating JSON in various
> languages. The Nodes produced by this lib need to be "manipulatable" as
> the unstructured values they represent.
It isn't really clear to me what you mean by this. What exactly about
JSONValue can't be manipulated like the "unstructured values [it]
represent[s]"?
Or do you perhaps mean the JSON -> deserialize -> manipulate ->
serialize -> JSON approach? That definitely is not a "loser strategy"*,
but yes, it is limited to applications where you have a partially fixed
schema. However, arguably most applications fall into that category.
* OT: My personal observation is that sadly the overall tone in the
community has generally become a lot less friendly over the last months.
I'm a bit worried about where this may lead in the long term.
More information about the Digitalmars-d
mailing list