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

Takeru Ohta 98e6718b0e Merge branch 'master' of github.com:sile/jsone 10 лет назад
doc 62aea81f65 Add English document 10 лет назад
src 10904e17b7 Update documents 10 лет назад
test 62aea81f65 Add English document 10 лет назад
.gitignore 67a1b09ce3 Update rebar to 2.5.0 10 лет назад
COPYING 8cfca951e7 Makefileやrebar.configなどを少し整理 11 лет назад
Makefile 62aea81f65 Add English document 10 лет назад
README.md 98e6718b0e Merge branch 'master' of github.com:sile/jsone 10 лет назад
rebar 67a1b09ce3 Update rebar to 2.5.0 10 лет назад
rebar.config 6e36665c67 rebar.configにnativeオプションが残ってしまっていたので除去 11 лет назад

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 |