Лучше кодер Jason для схем автоматически - PullRequest
0 голосов
/ 02 сентября 2018

Я получил это предупреждение

предупреждение: протокол 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, используя только один файл конфигурации кодировщика, чтобы все параметры кодирования определялись в одном месте.

1 Ответ

0 голосов
/ 03 сентября 2018

Вы явно не можете повредить реализацию Jason по умолчанию для чего-либо. Вы должны явно указать Jason, как ваши структуры должны быть сериализованы.

Отрывок из Джейсона Ридма :

Если вам нужно кодировать некоторую структуру, которая не реализует протокол, если вы владеете структурой, вы можете получить реализацию, определяющую, какие поля должны быть закодированы в JSON:

@derive {Jason.Encoder, only: [....]}
defstruct # ...

Тем не менее, вы должны явно указать, какие поля должны быть отфильтрованы, используя атрибут модуля @derive.

...