On Thursday, 16 April 2015 at 12:17:55 UTC, Sönke Ludwig wrote:
Am 16.04.2015 um 13:03 schrieb Jacob Carlborg:
On 2015-04-16 11:29, Sönke Ludwig wrote:

I'd like to let that be part of a more general serialization framework in top of this package instead of integrating a simplistic custom
solution that will then later be obsoleted.

I was thinking about some low level primitives that a serialization library could use. Types that cannot be broken in to smaller parts,
integer, bool and so on.

Having said that, you can go through JSONToken instead of JSONValue
for lower (computational) overhead.

Something like?

JSONToken token;
token.number = 3;
token.kind = JSONToken.Kind.number;
toJSON(token);

Yes, just without setting the kind explicitly (it's set automatically by assigning to the number property). Instead of toJSON(), writeJSON() would probably be more appropriate to avoid additional allocations.


Or what would you recommend a serialization library used?


The simplest target for a serialization library would be to generate a stream of JSONParserNodes. That way the serializer doesn't have to keep track of nesting levels and can reuse the pretty printing functionality of stdx.data.generator.

However, this currently requires an input range of JSONParserNodes, which looks like it is suboptimal for a serializer (either requires an explicitly allocated node array, or a strange serializer architecture that directly works as an input range). For that reason I'm thinking about providing an output range interface like so:

        auto dst = appender!string;
        auto rng = jsonOutputRange(dst);

        JSONParserNode n;
        // start an object
        n.kind = JSONParserNode.Kind.objectStart;
        rng.put(n);

        // write a single entry "foo": 10.5
        n.key = "foo";
        rng.put(n);
        rng.put(10.5);

        // write another entry "bar": true
        n.key = "bar";
        rng.put(n);
        rng.put(true);

        // finish the object
        n.kind = JSONParserNode.Kind.objectEnd;
        rng.put(n);

        writefln("JSON: %s", dst.data);

What do you think?

BTW, looks like JSONToken could use a set of constructors for more convenient in-place construction.

I think serialiastion for this JSON library should probably be considered out of scope until we have a general serisalisation API. Then once we have both, we can marry the two together. So as you say, the support from your end seems to be there. There just needs to be a serialiser to hook into it.

Reply via email to