| commit | eb70deb8317cb04d09eed5a298123e6f6d00d6e3 | [log] [tgz] |
|---|---|---|
| author | Paul J. Davis <paul.joseph.davis@gmail.com> | Mon Jun 16 21:39:49 2014 -0500 |
| committer | Paul J. Davis <paul.joseph.davis@gmail.com> | Mon Jun 16 21:40:26 2014 -0500 |
| tree | ffaab50678f21fa6f232ecd91b4d795333eeb9e9 | |
| parent | a232221c4249d31ea09dae730d556401392a98a6 [diff] |
Fix timeouts for short doubles Timeouts apparently don't actually work unless you use a test generator. Which makes sense in hindsight.
A JSON parser as a NIF. This is a complete rewrite of the work I did in EEP0018 that was based on Yajl. This new version is a hand crafted state machine that does its best to be as quick and efficient as possible while not placing any constraints on the parsed JSON.
Jiffy is a simple API. The only thing that might catch you off guard is that the return type of jiffy:encode/1 is an iolist even though it returns a binary most of the time.
A quick note on unicode. Jiffy only understands UTF-8 in binaries. End of story.
Errors are raised as exceptions.
Eshell V5.8.2 (abort with ^G)
1> jiffy:decode(<<"{\"foo\": \"bar\"}">>).
{[{<<"foo">>,<<"bar">>}]}
2> Doc = {[{foo, [<<"bing">>, 2.3, true]}]}.
{[{foo,[<<"bing">>,2.3,true]}]}
3> jiffy:encode(Doc).
<<"{\"foo\":[\"bing\",2.3,true]}">>
jiffy:decode/1,2jiffy:decode(IoData)jiffy:decode(IoData, Options)The options for decode are:
{bytes_per_iter, N} where N >= 0 - This controls the number of bytes that Jiffy will process before yielding back to the VM. The mechanics of this yield are completely hidden from the end user.jiffy:encode/1,2jiffy:encode(EJSON)jiffy:encode(EJSON, Options)where EJSON is a valid representation of JSON in Erlang according to the table below.
The options for encode are:
uescape - Escapes UTF-8 sequences to produce a 7-bit clean outputpretty - Produce JSON using two-space indentationforce_utf8 - Force strings to encode as UTF-8 by fixing broken surrogate pairs and/or using the replacement character to remove broken UTF-8 sequences in data.{bytes_per_iter, N} where N >= 0 - This controls the number of bytes that Jiffy will generate before yielding back to the VM. The mechanics of this yield are completely hidden from the end user.Erlang JSON Erlang
==========================================================================
null -> null -> null
true -> true -> true
false -> false -> false
"hi" -> [104, 105] -> [104, 105]
<<"hi">> -> "hi" -> <<"hi">>
hi -> "hi" -> <<"hi">>
1 -> 1 -> 1
1.25 -> 1.25 -> 1.25
[] -> [] -> []
[true, 1.0] -> [true, 1.0] -> [true, 1.0]
{[]} -> {} -> {[]}
{[{foo, bar}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]}
{[{<<"foo">>, <<"bar">>}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]}
Jiffy should be in all ways an improvemnt over EEP0018. It no longer imposes limits on the nesting depth. It is capable of encoding and decoding large numbers and it does quite a bit more validation of UTF-8 in strings.