|
149 | 149 |
|
150 | 150 | defimpl JSON.Encoder, for: Map do
|
151 | 151 | def encode(value, encoder) do
|
152 |
| - :elixir_json.encode_map(value, encoder) |
| 152 | + case :maps.next(:maps.iterator(value)) do |
| 153 | + :none -> |
| 154 | + "{}" |
| 155 | + |
| 156 | + {key, value, iterator} -> |
| 157 | + [?{, key(key, encoder), ?:, encoder.(value, encoder) | next(iterator, encoder)] |
| 158 | + end |
153 | 159 | end
|
| 160 | + |
| 161 | + defp next(iterator, encoder) do |
| 162 | + case :maps.next(iterator) do |
| 163 | + :none -> |
| 164 | + "}" |
| 165 | + |
| 166 | + {key, value, iterator} -> |
| 167 | + [?,, key(key, encoder), ?:, encoder.(value, encoder) | next(iterator, encoder)] |
| 168 | + end |
| 169 | + end |
| 170 | + |
| 171 | + defp key(key, encoder) when is_atom(key), do: encoder.(Atom.to_string(key), encoder) |
| 172 | + defp key(key, encoder) when is_binary(key), do: encoder.(key, encoder) |
| 173 | + defp key(key, encoder), do: encoder.(String.Chars.to_string(key), encoder) |
154 | 174 | end
|
155 | 175 |
|
156 | 176 | defimpl JSON.Encoder, for: Duration do
|
@@ -262,17 +282,15 @@ defmodule JSON do
|
262 | 282 |
|
263 | 283 | Elixir primitive types are encoded to JSON as follows:
|
264 | 284 |
|
265 |
| - | **Elixir** | **JSON** | |
266 |
| - |------------------------|----------| |
267 |
| - | `integer() \| float()` | Number | |
268 |
| - | `true \| false ` | Boolean | |
269 |
| - | `nil` | Null | |
270 |
| - | `binary()` | String | |
271 |
| - | `atom()` | String | |
272 |
| - | `list()` | Array | |
273 |
| - | `%{binary() => _}` | Object | |
274 |
| - | `%{atom() => _}` | Object | |
275 |
| - | `%{integer() => _}` | Object | |
| 285 | + | **Elixir** | **JSON** | |
| 286 | + |----------------------------|----------| |
| 287 | + | `integer() \| float()` | Number | |
| 288 | + | `true \| false ` | Boolean | |
| 289 | + | `nil` | Null | |
| 290 | + | `binary()` | String | |
| 291 | + | `atom()` | String | |
| 292 | + | `list()` | Array | |
| 293 | + | `%{String.Chars.t() => _}` | Object | |
276 | 294 |
|
277 | 295 | You may also implement the `JSON.Encoder` protocol for custom data structures.
|
278 | 296 | Some built-in data-structures already derive the `JSON.Encoder` protocol:
|
@@ -499,7 +517,7 @@ defmodule JSON do
|
499 | 517 | do: :elixir_json.encode_list(value, encoder)
|
500 | 518 |
|
501 | 519 | def protocol_encode(%{} = value, encoder) when not is_map_key(value, :__struct__),
|
502 |
| - do: :elixir_json.encode_map(value, encoder) |
| 520 | + do: JSON.Encoder.Map.encode(value, encoder) |
503 | 521 |
|
504 | 522 | def protocol_encode(value, encoder),
|
505 | 523 | do: JSON.Encoder.encode(value, encoder)
|
|
0 commit comments