Browse Source

Default object format is changed format from `tuple` to `map`

Takeru Ohta 9 years ago
parent
commit
c06a991030
6 changed files with 29 additions and 20 deletions
  1. 11 3
      README.md
  2. 1 1
      doc/jsone.md
  3. 1 2
      rebar.config
  4. 1 1
      src/jsone.erl
  5. 1 1
      src/jsone_decode.erl
  6. 14 12
      test/jsone_decode_tests.erl

+ 11 - 3
README.md

@@ -54,7 +54,13 @@ Usage Example
 [1,2,3]
 [1,2,3]
 
 
 > jsone:decode(<<"{\"1\":2}">>).
 > jsone:decode(<<"{\"1\":2}">>).
-{[{<<"1">>,2}]}
+#{<<"1">> => 2}
+
+> jsone:decode(<<"{\"1\":2}">>, [{object_format, tuple}]). % tuple format
+{[{<<"1">>, 2}]}
+
+> jsone:decode(<<"{\"1\":2}">>, [{object_format, proplist}]). % proplist format
+[{<<"1">>, 2}]
 
 
 > jsone:try_decode(<<"[1,2,3] \"next value\"">>). % try_decode/1 returns remaining (unconsumed binary)
 > jsone:try_decode(<<"[1,2,3] \"next value\"">>). % try_decode/1 returns remaining (unconsumed binary)
 {ok,[1,2,3],<<" \"next value\"">>}
 {ok,[1,2,3],<<" \"next value\"">>}
@@ -77,7 +83,9 @@ Usage Example
 > jsone:encode([1,2,3]).
 > jsone:encode([1,2,3]).
 <<"[1,2,3]">>
 <<"[1,2,3]">>
 
 
-> jsone:encode({[{<<"key">>, <<"value">>}]}).
+> jsone:encode(#{<<"key">> => <<"value">>}).  % map format
+> jsone:encode({[{<<"key">>, <<"value">>}]}). % tuple format
+> jsone:encode([{<<"key">>, <<"value">>}]).  % proplist format
 <<"{\"key\":\"value\"}">>
 <<"{\"key\":\"value\"}">>
 
 
 > jsone:encode({[{key, <<"value">>}]}). % atom key is allowed
 > jsone:encode({[{key, <<"value">>}]}). % atom key is allowed
@@ -97,7 +105,7 @@ Usage Example
                               [{line,138}]}]}}
                               [{line,138}]}]}}
 
 
 %% Pretty Print
 %% Pretty Print
-> Data = [true, {[{<<"1">>, 2}, {<<"array">>, [[[[1]]], {[{<<"ab">>, <<"cd">>}]}, false]}]}, null],
+> Data = [true, #{<<"1">> => 2, <<"array">> => [[[[1]]], #{<<"ab">> => <<"cd">>}, false]}, null],
 > io:format("~s\n", jsone:encode(Data, [{indent, 1}, {space, 2}])).
 > io:format("~s\n", jsone:encode(Data, [{indent, 1}, {space, 2}])).
 [
 [
   true,
   true,

+ 1 - 1
doc/jsone.md

@@ -27,7 +27,7 @@ decode_option() = {object_format, tuple | proplist | map}
 - `tuple`: An object is decoded as `{[]}` if it is empty, otherwise `{[{Key, Value}]}`. <br />
 - `tuple`: An object is decoded as `{[]}` if it is empty, otherwise `{[{Key, Value}]}`. <br />
 - `proplist`: An object is decoded as `[{}]` if it is empty, otherwise `[{Key, Value}]`. <br />
 - `proplist`: An object is decoded as `[{}]` if it is empty, otherwise `[{Key, Value}]`. <br />
 - `map`: An object is decoded as `#{}` if it is empty, otherwise `#{Key => Value}`. <br />
 - `map`: An object is decoded as `#{}` if it is empty, otherwise `#{Key => Value}`. <br />
-- default: `tuple` <br />
+- default: `map` <br />
 
 
 
 
 
 

+ 1 - 2
rebar.config

@@ -29,8 +29,7 @@
 
 
 {dialyzer,
 {dialyzer,
  [
  [
-  {warnings, [error_handling, unmatched_returns]},
-  {get_warnings, true}
+  {warnings, [error_handling, race_conditions, unmatched_returns]}
  ]}.
  ]}.
 
 
 {profiles,
 {profiles,

+ 1 - 1
src/jsone.erl

@@ -124,7 +124,7 @@
 %%  - `tuple': An object is decoded as `{[]}' if it is empty, otherwise `{[{Key, Value}]}'. <br />
 %%  - `tuple': An object is decoded as `{[]}' if it is empty, otherwise `{[{Key, Value}]}'. <br />
 %%  - `proplist': An object is decoded as `[{}]' if it is empty, otherwise `[{Key, Value}]'. <br />
 %%  - `proplist': An object is decoded as `[{}]' if it is empty, otherwise `[{Key, Value}]'. <br />
 %%  - `map': An object is decoded as `#{}' if it is empty, otherwise `#{Key => Value}'. <br />
 %%  - `map': An object is decoded as `#{}' if it is empty, otherwise `#{Key => Value}'. <br />
-%%  - default: `tuple' <br />
+%%  - default: `map' <br />
 
 
 %%--------------------------------------------------------------------------------
 %%--------------------------------------------------------------------------------
 %% Exported Functions
 %% Exported Functions

+ 1 - 1
src/jsone_decode.erl

@@ -51,7 +51,7 @@
 
 
 -type decode_result() :: {ok, jsone:json_value(), Rest::binary()} | {error, {Reason::term(), [erlang:stack_item()]}}.
 -type decode_result() :: {ok, jsone:json_value(), Rest::binary()} | {error, {Reason::term(), [erlang:stack_item()]}}.
 
 
--record(decode_opt_v1, { object_format=tuple :: tuple | proplist | map}).
+-record(decode_opt_v1, { object_format=map :: tuple | proplist | map}).
 -define(OPT, #decode_opt_v1).
 -define(OPT, #decode_opt_v1).
 -type opt() :: #decode_opt_v1{}.
 -type opt() :: #decode_opt_v1{}.
 
 

+ 14 - 12
test/jsone_decode_tests.erl

@@ -162,28 +162,30 @@ decode_test_() ->
      {"simple object",
      {"simple object",
       fun () ->
       fun () ->
               Input    = <<"{\"1\":2,\"key\":\"value\"}">>,
               Input    = <<"{\"1\":2,\"key\":\"value\"}">>,
+              Expected = #{<<"1">> => 2, <<"key">> => <<"value">>},
+              ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input)), % `map' is the default format
+              ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input, [{object_format, map}]))
+      end},
+     {"simple object: tuple or proplist",
+      fun () ->
+              Input    = <<"{\"1\":2,\"key\":\"value\"}">>,
               Expected = {[{<<"1">>, 2},{<<"key">>, <<"value">>}]},
               Expected = {[{<<"1">>, 2},{<<"key">>, <<"value">>}]},
-              ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input)),
+              ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input, [{object_format, tuple}])),
               ?assertEqual({ok, element(1, Expected), <<"">>}, jsone_decode:decode(Input, [{object_format, proplist}]))
               ?assertEqual({ok, element(1, Expected), <<"">>}, jsone_decode:decode(Input, [{object_format, proplist}]))
       end},
       end},
      {"object: contains whitespaces",
      {"object: contains whitespaces",
       fun () ->
       fun () ->
               Input    = <<"{  \"1\" :\t 2,\n\r\"key\" :   \n  \"value\"}">>,
               Input    = <<"{  \"1\" :\t 2,\n\r\"key\" :   \n  \"value\"}">>,
-              Expected = {[{<<"1">>, 2},{<<"key">>, <<"value">>}]},
+              Expected = #{<<"1">> => 2, <<"key">> => <<"value">>},
               ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input))
               ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input))
       end},
       end},
      {"empty object",
      {"empty object",
       fun () ->
       fun () ->
-              ?assertEqual({ok, {[]}, <<"">>}, jsone_decode:decode(<<"{}">>)),
-              ?assertEqual({ok, {[]}, <<"">>}, jsone_decode:decode(<<"{ \t\r\n}">>)),
+              ?assertEqual({ok, #{}, <<"">>}, jsone_decode:decode(<<"{}">>)),
+              ?assertEqual({ok, #{}, <<"">>}, jsone_decode:decode(<<"{ \t\r\n}">>)),
+              ?assertEqual({ok, {[]}, <<"">>}, jsone_decode:decode(<<"{}">>, [{object_format, tuple}])),
               ?assertEqual({ok, [{}], <<"">>}, jsone_decode:decode(<<"{}">>, [{object_format, proplist}]))
               ?assertEqual({ok, [{}], <<"">>}, jsone_decode:decode(<<"{}">>, [{object_format, proplist}]))
       end},
       end},
-     {"simple object: map",
-      fun () ->
-              Input    = <<"{\"1\":2,\"key\":\"value\"}">>,
-              Expected = #{<<"1">> => 2, <<"key">> => <<"value">>},
-              ?assertEqual({ok, Expected, <<"">>}, jsone_decode:decode(Input, [{object_format, map}]))
-      end},
      {"empty object: map",
      {"empty object: map",
       fun () ->
       fun () ->
               ?assertEqual({ok, #{}, <<"">>}, jsone_decode:decode(<<"{}">>, [{object_format, map}]))
               ?assertEqual({ok, #{}, <<"">>}, jsone_decode:decode(<<"{}">>, [{object_format, map}]))
@@ -198,7 +200,7 @@ decode_test_() ->
       fun () ->
       fun () ->
               Input = <<"{\"1\":2, \"key\":\"value\", }">>,
               Input = <<"{\"1\":2, \"key\":\"value\", }">>,
               io:format("~p\n", [catch jsone_decode:decode(Input)]),
               io:format("~p\n", [catch jsone_decode:decode(Input)]),
-              ?assertMatch({error, {badarg, _}}, jsone_decode:decode(Input))
+              ?assertMatch({error, {badarg, _}}, jsone_decode:decode(Input, [{object_format, tuple}]))
       end},
       end},
      {"object: missing comma",
      {"object: missing comma",
       fun () ->
       fun () ->
@@ -230,7 +232,7 @@ decode_test_() ->
      {"compound data",
      {"compound data",
       fun () ->
       fun () ->
               Input    = <<"  [true, {\"1\" : 2, \"array\":[[[[1]]], {\"ab\":\"cd\"}, false]}, null]   ">>,
               Input    = <<"  [true, {\"1\" : 2, \"array\":[[[[1]]], {\"ab\":\"cd\"}, false]}, null]   ">>,
-              Expected = [true, {[{<<"1">>, 2}, {<<"array">>, [[[[1]]], {[{<<"ab">>, <<"cd">>}]}, false]}]}, null],
+              Expected = [true, #{<<"1">> => 2, <<"array">> => [[[[1]]], #{<<"ab">> => <<"cd">>}, false]}, null],
               ?assertEqual({ok, Expected, <<"   ">>}, jsone_decode:decode(Input))
               ?assertEqual({ok, Expected, <<"   ">>}, jsone_decode:decode(Input))
       end}
       end}
     ].
     ].