Browse Source

Merge pull request #54 from sile/fix-skip-undefined-bg

Fix a bug of `skip_undefined` encoding option
Takeru Ohta 4 years ago
parent
commit
805f247c47
3 changed files with 14 additions and 9 deletions
  1. 1 0
      rebar.config
  2. 10 6
      src/jsone_encode.erl
  3. 3 3
      test/jsone_encode_tests.erl

+ 1 - 0
rebar.config

@@ -52,6 +52,7 @@
    ]},
   {test,
    [
+    {erl_opts, [debug_info]},
     {plugins, [covertool]}
    ]}
  ]}.

+ 10 - 6
src/jsone_encode.erl

@@ -323,18 +323,22 @@ array_values([],       Nexts, Buf, Opt) -> next(Nexts, <<(pp_newline(Buf, Nexts,
 array_values([X | Xs], Nexts, Buf, Opt) -> value(X, [{array_values, Xs} | Nexts], Buf, Opt).
 
 -spec object(jsone:json_object_members(), [next()], binary(), opt()) -> encode_result().
-object([],      Nexts, Buf, Opt) ->
-    next(Nexts, <<Buf/binary, ${, $}>>, Opt);
-object(Members, Nexts, Buf, ?OPT{canonical_form = true}=Opt) ->
-  object_members(lists:sort(Members), Nexts, pp_newline(<<Buf/binary, ${>>, Nexts, 1, Opt), Opt);
+object(Members, Nexts, Buf, ?OPT{skip_undefined = true}=Opt) ->
+    object1(lists:filter(fun ({_, V}) -> V =/= undefined end, Members), Nexts, Buf, Opt);
 object(Members, Nexts, Buf, Opt) ->
+    object1(Members, Nexts, Buf, Opt).
+
+-spec object1(jsone:json_object_members(), [next()], binary(), opt()) -> encode_result().
+object1([],      Nexts, Buf, Opt) ->
+    next(Nexts, <<Buf/binary, ${, $}>>, Opt);
+object1(Members, Nexts, Buf, ?OPT{canonical_form = true}=Opt) ->
+    object_members(lists:sort(Members), Nexts, pp_newline(<<Buf/binary, ${>>, Nexts, 1, Opt), Opt);
+object1(Members, Nexts, Buf, Opt) ->
     object_members(Members, Nexts, pp_newline(<<Buf/binary, ${>>, Nexts, 1, Opt), Opt).
 
 -spec object_members(jsone:json_object_members(), [next()], binary(), opt()) -> encode_result().
 object_members([], Nexts, Buf, Opt) ->
     next(Nexts, <<(pp_newline(Buf, Nexts, Opt))/binary, $}>>, Opt);
-object_members([{_, undefined} | Xs], Nexts, Buf, ?OPT{skip_undefined=true}=Opt) ->
-    object_members(Xs, Nexts, Buf, Opt);
 object_members([{Key, Value} | Xs], Nexts, Buf, Opt) ->
     object_key(Key, [{object_value, Value, Xs} | Nexts], Buf, Opt);
 object_members(Arg, Nexts, Buf, Opt) ->

+ 3 - 3
test/jsone_encode_tests.erl

@@ -264,9 +264,9 @@ encode_test_() ->
       end},
      {"skip_undefined option",
       fun() ->
-              Object = #{<<"1">> => undefined, <<"2">> => 3},
-              ?assertEqual({ok,<<"{\"1\":null,\"2\":3}">>}, jsone_encode:encode(Object,[undefined_as_null])),
-              ?assertEqual({ok,<<"{\"2\":3}">>},            jsone_encode:encode(Object,[skip_undefined]))
+              Object = #{<<"1">> => undefined, <<"2">> => 3, <<"3">> => undefined},
+              ?assertEqual({ok,<<"{\"1\":null,\"2\":3,\"3\":null}">>}, jsone_encode:encode(Object,[undefined_as_null])),
+              ?assertEqual({ok,<<"{\"2\":3}">>},                       jsone_encode:encode(Object,[skip_undefined]))
       end},
 
      %% Pretty Print