Hi, I just wanted to comment on the dson file format. <div><br></div><div>While perhaps less efficient, the mongodb nosql database also uses a binary json (bson) format to store data. It implements some extra types though. I suggest that if you want to implement binary json, to seriously consider adopting bson instead:</div>
<div><br></div><meta http-equiv="content-type" content="text/html; charset=utf-8"><div><a href="http://bsonspec.org/">http://bsonspec.org/</a></div><div><br></div><div><a href="http://bsonspec.org/"></a><br><div class="gmail_quote">
2010/11/20 Robert Jacques <span dir="ltr"><<a href="mailto:sandford@jhu.edu">sandford@jhu.edu</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">I have been working on a re-write of std.json. The purpose was to fix implementation bugs, better conform to the spec, provide a lightweight tokenizer (Sean) and to use an Algebraic type (Andrei) for JSON values. In the progress of doing this, I made my parser 2x faster and updated/fixed a bunch of issues with VariantN in order to fully support Algebraic types. Both of these libraries are at a solid beta level, so I'd like to get some feedback, and provide a patch for those being held back by the problems with Algebraic. The code and docs are available at: <a href="https://jshare.johnshopkins.edu/rjacque2/public_html/" target="_blank">https://jshare.johnshopkins.edu/rjacque2/public_html/</a>. These files were written against DMD 2.050 and both depend on some patches currently in bugzilla (see the top of each file or below)<br>

<br>
Summary of Variant changes:<br>
* Depends on Issue 5155's patch<br>
* VariantN now properly supports types defined using "This".<br>
* Additional template constraints and acceptance of implicit converters in opAssign and ctor. i.e. if an Algebraic type supports reals, you can now assign an int to it.<br>
* Updated to using opBinary/opBinaryRight/opOpAssign. This adds right support to several functions and is now generated via compile time reflection + mixins: i.e. Algebraic types of user defined types should work, etc.<br>

* Added opIn support, though it currently on works for AAs.<br>
* Added opIndexOpAssign support.<br>
* Added opDispatch as an alternative indexing method. This allows Variants of type Variant[string] to behave like prototype structs: i.e. var.x = 5; instead of var["x"] = 5;<br>
<br>
Notes:<br>
* There's an bugzilla issue requesting opCall support in Variant. While I can see the usefulness, syntactically this clashes with the ctor. Should this issue be closed or should a method be used as an opCall surrogate?<br>

* Could someone explain to me the meaning/intension of "Future additions to Algebraic will allow compile-time checking that all possible types are handled by user code, eliminating a large class of errors." Is this something akin to final switch support?<br>

<br>
Summary of JSON changes:<br>
* Depends on the Variant improvements.<br>
* Depends on Issue 5233's patch<br>
* Depends on Issue 5236's patch<br>
* Issue 5232's patch is also recommended<br>
* The integer type was removed: JSON doesn't differentiate between floating and integral numbers. Internally, reals are used and on systems with 80-bit support, this encompasses all integral types.<br>
* UTF escape characters are now correctly support.<br>
* All routines/types were encapsulated in a JSON struct for name space reasons.<br>
* An Algebraic type is used for JSON values, with serialization/de-serialization routines as free methods.<br>
* Serialization/de-serialization centers around a set of input/output range to/from token range routines, with separate parser/writer routines.<br>
* Values can be written in either a concise (default) or pretty printed format. (i.e. indented with line returns)<br>
* Convenience toString and toStringHR routines exist.<br>
* Simple Type to/from json routines exist, but are marked as to be re-evaluated pending std.serialization.<br>
* I've implemented a binary format customized for JSON. Besides preserving numeric precision (i.e. 80-bit reals), I found it gave slightly smaller file size (~20%) and 2-3x parsing performance for a large numeric dataset of mine. I'm not sure if it's worth-while on the whole, so I'd appreciate feedback.<br>

<br>
Notes:<br>
* Does anyone have a suggestion of a good way to attach methods to an Algebraic type? And if we can, should we?<br>
_______________________________________________<br>
phobos mailing list<br>
<a href="mailto:phobos@puremagic.com" target="_blank">phobos@puremagic.com</a><br>
<a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
</blockquote></div><br></div>