mirror https://github.com/sile/jsone

Takeru Ohta c95229478a Update type definitions and edoc comments 10 years ago
doc c95229478a Update type definitions and edoc comments 10 years ago
src c95229478a Update type definitions and edoc comments 10 years ago
test 80c7fb518d Add encode_opt() to choose native or escaped utf8 code 10 years ago
.gitignore 67a1b09ce3 Update rebar to 2.5.0 10 years ago
COPYING 8cfca951e7 Makefileやrebar.configなどを少し整理 11 years ago
Makefile 62aea81f65 Add English document 10 years ago
README.md 98e6718b0e Merge branch 'master' of github.com:sile/jsone 10 years ago
rebar 67a1b09ce3 Update rebar to 2.5.0 10 years ago
rebar.config 4c834a144a Remove trailing whitespaces 10 years ago

README.md

jsone (0.2.3)

An Erlang library for encoding, decoding JSON data.

Features

  • Provides simple encode/decode function only
  • RFC4627-compliant
  • Supports UTF-8 encoded binary
  • Pure Erlang
  • Highly Efficient
    • Maybe one of the fastest JSON library (except those which are implemented in NIF)
    • Decode function is written in continuation-passing style(CPS)

QuickStart

# clone
$ git clone git://github.com/sile/jsone.git
$ cd jsone

# If you want to use HiPE enabled version, please execute following command.
# $ git checkout hipe

# compile
$ make compile

# run tests
$ make eunit

# dialyze
$ make dialyze

# Erlang shell
$ make start
1> jsone:decode(<<"[1,2,3]">>).
[1,2,3]

Usage Example

%% Decode
> jsone:decode(<<"[1,2,3]">>).
[1,2,3]

> jsone:decode(<<"{\"1\":2}">>).
{[{<<"1">>,2}]}

> jsone:try_decode(<<"[1,2,3] \"next value\"">>). % try_decode/1 returns remaining (unconsumed binary)
{ok,[1,2,3],<<" \"next value\"">>}

% error: raises exception
> jsone:decode(<<"1.x">>).
** exception error: bad argument
     in function  jsone_decode:number_fraction_part_rest/6
        called as jsone_decode:number_fraction_part_rest(<<"x">>,1,1,0,[],<<>>)
     in call from jsone:decode/1 (src/jsone.erl, line 71)

% error: returns {error, Reason}
> jsone:try_decode(<<"1.x">>).
{error,{badarg,[{jsone_decode,number_fraction_part_rest,
                              [<<"x">>,1,1,0,[],<<>>],
                              [{line,228}]}]}}


%% Encode
> jsone:encode([1,2,3]).
<<"[1,2,3]">>

> jsone:encode({[{<<"key">>, <<"value">>}]}).
<<"{\"key\":\"value\"}">>

% error: raises exception
> jsone:encode({[{key, <<"value">>}]}). % non binary key is not allowed
** exception error: bad argument
     in function  jsone_encode:object_members/3
        called as jsone_encode:object_members([{key,<<"value">>}],[],<<"{">>)
     in call from jsone:encode/1 (src/jsone.erl, line 97)

% error: returns {error, Reason}
> jsone:try_encode({[{key, <<"value">>}]}).
{error,{badarg,[{jsone_encode,object_members,
                              [[{key,<<"value">>}],[],<<"{">>],
                              [{line,138}]}]}}

Data Mapping (Erlang <=> JSON)

Erlang JSON
number 123 123
null null null
boolean true true
string <<"abc">> "abc"
array [1,2,3] [1,2,3]
object {[{<<"key">>, <<"value">>}]} {"key":"value"}

API

See EDoc Document

Benchmark

Environment/Method

  • OS: CentOS 6.5
  • CPU: Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz (x8)
  • Erlang/OTP: R17.1
  • Benchmark Tool: erl_json_test
  • CompileOption: [native, {hipe, [o3]}]

Target

Decode Result

  • column: module name
  • row: data size (bytes)
  • cell: elapsed time (micro seconds)

| | jiffy | jsone | jsonerl | jsonx | jsx | mochijson2 | yawsjson2 | |------------------:|------:|------:|--------:|------:|------:|-----------:|----------:| | 559 (1x) | 12 | 11 | 61 | 7 | 50 | 28 | 37 | | 1583 (3x) | 24 | 25 | 66 | 15 | 134 | 68 | 84 | | 4637 (9x) | 65 | 86 | 178 | 36 | 410 | 186 | 311 | | 13914 (27x) | 189 | 271 | 533 | 109 | 1466 | 550 | 582 | | 41542 (81x) | 525 | 813 | 1578 | 299 | 4684 | 1599 | 1939 | | 124726 (243x) | 1549 | 2406 | 4709 | 852 | 14562 | 4799 | 6123 |

Encode Result

  • column: module name
  • row: data size (bytes)
  • cell: elapsed time (micro seconds)

| | jiffy | jsone | jsonerl | jsonx | jsx | mochijson2 | yawsjson2 | |------------------:|------:|------:|--------:|------:|------:|-----------:|----------:| | 559 (1x) | 14 | 19 | 21 | 8 | 83 | 19 | 15 | | 1583 (3x) | 29 | 49 | 65 | 14 | 228 | 61 | 42 | | 4637 (9x) | 77 | 133 | 229 | 36 | 638 | 225 | 161 | | 13914 (27x) | 215 | 393 | 737 | 101 | 1993 | 664 | 435 | | 41542 (81x) | 621 | 1172 | 2058 | 300 | 6237 | 2310 | 1192 | | 124726 (243x) | 1830 | 3968 | 5842 | 828 | 17032 | 6979 | 5266 |