Poison
允许实现Poison.Encoder
协议。Float
显然存在的实现,这就是为什么我建议将您的浮动包装到自定义的FloatStruct
前期:
defmodule FloatStruct do
defstruct value: 0.0, format: [:compact, {:decimals, 10}]
end
defimpl Poison.Encoder, for: FloatStruct do
def encode(%{value: value, format: format}, options) do
Poison.Encoder.BitString.encode(
:erlang.float_to_binary(value, format), options)
end
end
我知道这需要遍历嵌套术语来Float
用 s 包装 s FloatStruct
,但我没有看到任何更简单的方法。不过,我可能是错的。
可以免费支持 OP 格式中提到的两种:
defimpl Poison.Encoder, for: FloatStruct do
def encode(%{value: value, format: format}, options) do
Poison.Encoder.BitString.encode(
format(value, format), options)
end
defp format(value, format) when is_list(format),
do: :erlang.float_to_binary(value, format)
defp format(value, format) when is_binary(format),
do: :io.format(format, [value])
end