【发布时间】:2018-09-02 12:10:32
【问题描述】:
我收到了这个警告
警告:Jason.Encoder 协议已经整合,Any 的实现无效。如果您想在编译后或测试期间实现协议,请查看 Kernel.defprotocol/2 文档中的“合并”部分 lib/encoder.ex:1
警告:重新定义模块 Jason.Encoder.Any(从 /Users/dev/projects/haitracker.com/haitracker-be/_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 的所有模式,只需一个编码器配置文件,以便在一个地方定义所有编码选项。
【问题讨论】:
-
@denis.peplin 实际上。不,我已经通过了所有
README -
要求排除
__meta__和__struct__字段,如果某些关联没有加载,我们也需要跳过这些字段。您可以将这些键称为全局跳过键和值。我想排除每个模式/模型的几个键。即本地skip_keys
标签: json encoding elixir schema phoenix-framework