Wanted: Review manager for std.data.json

w0rp via Digitalmars-d digitalmars-d at puremagic.com
Thu Apr 16 05:28:33 PDT 2015


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.


More information about the Digitalmars-d mailing list