From a1dce612f56f80dbdf0d1cd183928d0d0d02d31f Mon Sep 17 00:00:00 2001 From: preciz Date: Sun, 14 Jun 2026 15:33:02 +0200 Subject: [PATCH] Optimize Map JSON encoding using :maps.to_list --- lib/elixir/lib/json.ex | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/lib/elixir/lib/json.ex b/lib/elixir/lib/json.ex index d5daa3e6b9d..0a3c01a56c6 100644 --- a/lib/elixir/lib/json.ex +++ b/lib/elixir/lib/json.ex @@ -154,23 +154,21 @@ end defimpl JSON.Encoder, for: Map do def encode(value, encoder) do - case :maps.next(:maps.iterator(value)) do - :none -> + case :maps.to_list(value) do + [] -> "{}" - {key, value, iterator} -> - [?{, key(key, encoder), ?:, encoder.(value, encoder) | next(iterator, encoder)] + [{key, value} | rest] -> + [?{, key(key, encoder), ?:, encoder.(value, encoder) | next(rest, encoder)] end end - defp next(iterator, encoder) do - case :maps.next(iterator) do - :none -> - "}" + defp next([], _encoder) do + "}" + end - {key, value, iterator} -> - [?,, key(key, encoder), ?:, encoder.(value, encoder) | next(iterator, encoder)] - end + defp next([{key, value} | rest], encoder) do + [?,, key(key, encoder), ?:, encoder.(value, encoder) | next(rest, encoder)] end # Erlang supports only numbers, binaries, and atoms as keys,