Я получил это предупреждение
предупреждение: протокол Jason.Encoder уже консолидирован, реализация Any не имеет никакого эффекта. Если вы хотите реализовать протоколы после компиляции или во время тестов, проверьте раздел «Консолидация» в документации для Kernel.defprotocol / 2.
Библиотека / encoder.ex: 1
предупреждение: переопределение модуля Jason.Encoder.Any (текущая версия загружена из /Users/dev/projects/haitracker.com/haitracker-be/_build/dev/lib/jason/ebin/Elixir.Jason.Encoder .Any.beam)
Библиотека / encoder.ex: 1
со следующим кодером
defimpl Jason.Encoder, for: Any do
def encode(%{__struct__: _} = struct, _options) do
skip_keys =
case struct.__struct__ do
Haitracker.User ->
[
:local_password_hash,
:login_status_message
]
# TODO: define skip keys for each model and pass to this function
_whatever ->
[]
end
struct
|> Map.from_struct()
|> sanitize_map(skip_keys)
|> Jason.encode!()
end
defp sanitize_map(map, skip_keys) do
filter = fn {key, val} ->
cond do
key in [:__meta__, :__struct__] ->
false
is_map(val) ->
Ecto.assoc_loaded?(val)
key not in skip_keys ->
true
true ->
false
end
end
map
|> Enum.filter(filter)
|> Enum.into(%{})
end
end
Мне интересно, есть ли лучший способ кодировать все схемы, которые я использую, используя Jason
, используя только один файл конфигурации кодировщика, чтобы все параметры кодирования определялись в одном месте.