JSON是日常开发使用到的数据格式。

Erlang的JSON的库有

其中jiffy是NIF实现,其它两个是pure Erlang实现。

jiffy

使用jiffy

在rebar.config添加

%% -*- mode: erlang -*-
{erl_opts, [debug_info]}.
{deps, [
        ...
        {jiffy,
         {git, "https://github.com/davisp/jiffy", 
          {branch, "master"}}},
        ...
       ]}.

jiffy常见用法

Eshell V9.3  (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]}">>
4> jiffy:decode(<<"{\"foo\": \"bar\"}">>, [return_maps]).
#{<<"foo">> => <<"bar">>}

jiffy数据类型

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">>}]}
#{<<"foo">> => <<"bar">>}  -> {"foo": "bar"} -> #{<<"foo">> => <<"bar">>}

常见误区

在Erlang中,json字符串要使用binary表示,如果使用list表示字符串的话,会被解析成array,这不是我们想要看到的结果。

1> jiffy:encode("abc").
<<"[97,98,99]">>
2> jiffy:encode(<<"abc">>).
<<"\"abc\"">>

bench

经过测试,jiffy性能远远比pure Erlang实现的要好,普通情况,大概有4倍的差距。简单结果如下:

                         jiffy_encode_simple_bench:   1000000      2731.92 ns/op
                         jsone_encode_simple_bench:    300000      8985.88 ns/op
                           jsx_encode_simple_bench:    500000      9013.57 ns/op
                         jiffy_decode_simple_bench:   2000000      1496.16 ns/op
                         jsone_decode_simple_bench:    500000      5942.48 ns/op
                           jsx_decode_simple_bench:    500000      8594.12 ns/op

详细见:https://github.com/roowe/ebench/blob/master/README-cn.md