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

Takeru Ohta eb5c1ad516 Update README.md 10 лет назад
doc 76009547bf Now atom() is allowed as an object key (in encoding) 10 лет назад
src 76009547bf Now atom() is allowed as an object key (in encoding) 10 лет назад
test 76009547bf Now atom() is allowed as an object key (in encoding) 10 лет назад
.gitignore 67a1b09ce3 Update rebar to 2.5.0 10 лет назад
COPYING 8cfca951e7 Makefileやrebar.configなどを少し整理 11 лет назад
Makefile 62aea81f65 Add English document 10 лет назад
README.md eb5c1ad516 Update README.md 10 лет назад
rebar 67a1b09ce3 Update rebar to 2.5.0 10 лет назад
rebar.config 4c834a144a Remove trailing whitespaces 10 лет назад

README.md

jsone (0.2.4)

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\"}">>

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

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

% error: returns {error, Reason}
> jsone:try_encode({[{123, <<"value">>}]}).
{error,{badarg,[{jsone_encode,object_members,
                              [[{123,<<"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">>},{hoge,123}]} {"key":"value","hoge":123}

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