重复的模块:'Elixir.Poison.Encoder.Map' 在 poison `mix release` 中指定
Duplicated modules: 'Elixir.Poison.Encoder.Map' specified in poison `mix release`
我在一个伞式应用程序中工作,该应用程序与 Poison 一起编码和解码 Json。为了编码我的 ecto 模型,我编写了以下实现:
def defimpl Poison.Encoder, for: Any do
def encode(%{__struct__: App.Models.Task} = struct, options) do
struct =
if struct.geom do
{lon, lat} = struct.geom.coordinates
%{struct | lon: lon, lat: lat}
else
struct
end
enconde_model(struct, options)
end
def encode(%{__struct__: _} = struct, options) do
enconde_model(struct, options)
end
def encode({lon, lat}, options) when is_float(lon) and is_float(lat) do
%{lon: lon, lat: lat}
|> sanitize_map()
|> Poison.Encoder.Map.encode(options)
end
defp enconde_model(model, options) do
model
|> Map.from_struct()
|> sanitize_map()
|> Poison.Encoder.Map.encode(options)
end
defp sanitize_map(map) do
map
|> Enum.filter(
fn({_, %Ecto.Association.NotLoaded{}}) -> false
({:__meta__, _}) -> false
({:__struct__, _}) -> false
({_, _}) -> true
end)
|> Map.new()
end
结束
我的想法是,一旦我 运行 mix release
程序就会引发错误,除非我注释掉上面显示的代码。
那么,还有另一种方法可以在不使用实现的情况下实现同样的功能吗?
您收到该错误是因为您覆盖了现有的编码器实现。正确的做法是为每个要编码的结构实现 Poison.Encoder
。使用 @derive
,这非常简单:
@derive {Poison.Encoder, only: [:the, :field, :names, :you, :want, :in, :json]}
schema "tasks" do
...
end
对于元组,您需要手动将它们转换为可包含这些元组的结构编码中的映射:
defimpl Poison.Encoder, for: Something do
def encode(%{a_tuple: {lat, lon}, something: else_}, options) do
Poison.encode!(%{location: %{lat: lat, lon: lon}, something: else_}, options)
end
end
我在一个伞式应用程序中工作,该应用程序与 Poison 一起编码和解码 Json。为了编码我的 ecto 模型,我编写了以下实现:
def defimpl Poison.Encoder, for: Any do
def encode(%{__struct__: App.Models.Task} = struct, options) do
struct =
if struct.geom do
{lon, lat} = struct.geom.coordinates
%{struct | lon: lon, lat: lat}
else
struct
end
enconde_model(struct, options)
end
def encode(%{__struct__: _} = struct, options) do
enconde_model(struct, options)
end
def encode({lon, lat}, options) when is_float(lon) and is_float(lat) do
%{lon: lon, lat: lat}
|> sanitize_map()
|> Poison.Encoder.Map.encode(options)
end
defp enconde_model(model, options) do
model
|> Map.from_struct()
|> sanitize_map()
|> Poison.Encoder.Map.encode(options)
end
defp sanitize_map(map) do
map
|> Enum.filter(
fn({_, %Ecto.Association.NotLoaded{}}) -> false
({:__meta__, _}) -> false
({:__struct__, _}) -> false
({_, _}) -> true
end)
|> Map.new()
end
结束
我的想法是,一旦我 运行 mix release
程序就会引发错误,除非我注释掉上面显示的代码。
那么,还有另一种方法可以在不使用实现的情况下实现同样的功能吗?
您收到该错误是因为您覆盖了现有的编码器实现。正确的做法是为每个要编码的结构实现 Poison.Encoder
。使用 @derive
,这非常简单:
@derive {Poison.Encoder, only: [:the, :field, :names, :you, :want, :in, :json]}
schema "tasks" do
...
end
对于元组,您需要手动将它们转换为可包含这些元组的结构编码中的映射:
defimpl Poison.Encoder, for: Something do
def encode(%{a_tuple: {lat, lon}, something: else_}, options) do
Poison.encode!(%{location: %{lat: lat, lon: lon}, something: else_}, options)
end
end