From 4ede49306d23885c1dc408fc9e11a5cf550031b0 Mon Sep 17 00:00:00 2001 From: Lukas Rieder Date: Wed, 20 Dec 2017 16:16:30 +0100 Subject: [PATCH] allow to map atoms to other values to handle null -> nil --- lib/poison/encoder.ex | 13 +++++++++++++ test/poison/encoder_test.exs | 2 ++ 2 files changed, 15 insertions(+) diff --git a/lib/poison/encoder.ex b/lib/poison/encoder.ex index a02e656f..d4f525d3 100644 --- a/lib/poison/encoder.ex +++ b/lib/poison/encoder.ex @@ -83,6 +83,7 @@ defprotocol Poison.Encoder do @typep indent :: non_neg_integer @typep offset :: non_neg_integer @typep strict_keys :: boolean + @typep force :: map @type options :: %{ optional(:escape) => escape, @@ -90,6 +91,7 @@ defprotocol Poison.Encoder do optional(:indent) => indent, optional(:offset) => offset, optional(:strict_keys) => strict_keys, + optional(:force) => force, } @spec encode(t, options) :: iodata @@ -103,9 +105,20 @@ defimpl Poison.Encoder, for: Atom do def encode(true, _), do: "true" def encode(false, _), do: "false" + def encode(atom, %{force: mapping} = options) when is_map(mapping) do + options = Map.delete(mapping, :force) + if Map.has_key?(mapping, atom) do + Map.get(mapping, atom) + |> Poison.Encoder.encode(options) + else + Encoder.BitString.encode(Atom.to_string(atom), options) + end + end + def encode(atom, options) do Encoder.BitString.encode(Atom.to_string(atom), options) end + end defimpl Poison.Encoder, for: BitString do diff --git a/test/poison/encoder_test.exs b/test/poison/encoder_test.exs index 433104a9..4f7a1115 100644 --- a/test/poison/encoder_test.exs +++ b/test/poison/encoder_test.exs @@ -8,6 +8,8 @@ defmodule Poison.EncoderTest do assert to_json(true) == "true" assert to_json(false) == "false" assert to_json(:poison) == ~s("poison") + assert to_json(:null) == ~s("null") + assert to_json(:null, force: %{null: nil}) == "null" end test "Integer" do