Json 更好的模式自动编码器

Json 更好的模式自动编码器,json,encoding,elixir,schema,phoenix-framework,Json,Encoding,Elixir,Schema,Phoenix Framework,我收到了这个警告 警告:Jason.Encoder协议已被整合,任何实现均无效。如果要在编译后或测试期间实现协议,请查看Kernel.defprotocol/2文档中的“整合”部分 lib/encoder.ex:1 警告:重新定义模块Jason.Encoder.Any(当前版本从/Users/dev/projects/haitracker.com/haitracker be/\u build/dev/lib/Jason/ebin/Elixir.Jason.Encoder.Any.beam加载)

我收到了这个警告

警告:Jason.Encoder协议已被整合,任何实现均无效。如果要在编译后或测试期间实现协议,请查看Kernel.defprotocol/2文档中的“整合”部分 lib/encoder.ex:1

警告:重新定义模块Jason.Encoder.Any(当前版本从/Users/dev/projects/haitracker.com/haitracker be/\u build/dev/lib/Jason/ebin/Elixir.Jason.Encoder.Any.beam加载) lib/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
,这样所有的编码选项都定义在一个地方。

显然不允许您破坏默认的
Jason
实现。您应该明确告诉Jason如何序列化结构

摘自:

如果您需要对某个未实现协议的结构进行编码,如果您拥有该结构,则可以派生实现,指定哪些字段应编码为JSON:

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

也就是说,您应该使用
@derivate
模块属性明确指定要过滤掉的字段。

显然,您不允许为任何事情破坏默认的
Jason
实现。您应该明确告诉Jason如何序列化结构

摘自:

如果您需要对某个未实现协议的结构进行编码,如果您拥有该结构,则可以派生实现,指定哪些字段应编码为JSON:

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

也就是说,您应该使用
@derivate
模块属性明确指定要过滤掉的字段。

这会有帮助吗@丹尼斯·佩普林。不需要。我已经检查了所有的
自述文件
要求是排除
\uuuuuu meta\uuuuu
\uuuu struct\uuuuu
字段,如果没有加载某些关联,我们也需要跳过这些字段。可以将这些键称为全局跳过键和值。我想排除每个模式/模型的几个键。i、 e本地跳过键这会有帮助吗@丹尼斯·佩普林。不需要。我已经检查了所有的
自述文件
要求是排除
\uuuuuu meta\uuuuu
\uuuu struct\uuuuu
字段,如果没有加载某些关联,我们也需要跳过这些字段。可以将这些键称为全局跳过键和值。我想排除每个模式/模型的几个键。i、 本地跳过键问题是我想动态排除未加载的关联。否则,您的解决方案是完美的。为此,您基本上有两个选择:为
NotLoaded
实现协议或在编码之前对其进行过滤。过滤似乎是解决方案。因为如果我为NotLoaded实现协议,我必须返回前端开发者不想要的东西,例如
NotLoaded
etc或nil。他们希望所有的关联都有对象值,或者跳过,如果这些关联没有加载好,我个人会为消费者端过滤掉的未加载关联提供一个特定的协商唯一值。前端负责决定如何处理不需要的值。只是在后端过滤它们会破坏一致性。问题是我想动态排除未加载的关联。否则,您的解决方案是完美的。为此,您基本上有两个选择:为
NotLoaded
实现协议或在编码之前对其进行过滤。过滤似乎是解决方案。因为如果我为NotLoaded实现协议,我必须返回前端开发者不想要的东西,例如
NotLoaded
etc或nil。他们希望所有的关联都有对象值,或者跳过,如果这些关联没有加载好,我个人会为消费者端过滤掉的未加载关联提供一个特定的协商唯一值。前端负责决定如何处理不需要的值。只是在后端过滤掉它们,就会破坏一致性。