无法返回编码:Poison中的日期类型

时间:2015-03-26 03:36:22

标签: elixir phoenix-framework

我在凤凰城使用默认的json工具,但出于某种原因,我无法返回任何日期(字段类型:日期)。我得到这样的东西:

unable to encode value: {2015, 3, 24}

我在类型为date的db中使用postgres db。我错过了什么吗?在用毒素编码之前,是否需要构建一个解析日期的函数?

3 个答案:

答案 0 :(得分:5)

你的“约会对象”只是一个Elixir元组。 Posion不知道如何编码Elixir元组:

iex(1)> Poison.encode({2015, 3, 24}) 
{:error, {:invalid, {2015, 3, 24}}}

如果您首先将日期格式化为字符串,Posion可以毫不费力地将其编码为JSON:

iex(2)> Poison.encode(:io_lib.format("~4..0B-~2..0B-~2..0B", [2015, 3, 24]) |> List.flatten |> to_string)
{:ok, "\"2015-03-24\""}

希望这会有所帮助。

答案 1 :(得分:1)

感谢上面的Jordan Dimov,我最终创建了一个名为formatter的模块,它有一个这种格式的变体和一个money formatter。在这里,如果它对任何人都有帮助:

defmodule Myapp.Formatter do



def date(date) do
    :io_lib.format("~4..0B-~2..0B-~2..0B", Tuple.to_list(date))
      |> List.flatten
      |> to_string
  end

  def money(money) do
    (money.coef/100)*money.sign
  end

end

我将模块别名在myapp.Web模块中的视图下,因此我的视图中的函数可以在返回Json之前进行格式化。谢谢!

答案 2 :(得分:1)

在下一个凤凰版本(v0.11)中,这将会变得更好:

  1. 新凤凰版将通过phoenix_ecto项目自动包含Ecto.DateTimeEcto.Date的编码器。所以它应该正常工作。

  2. 也就是说,您可能希望使用Ecto.DateTimeEcto.Date和朋友而不是:datetime:time,因为您将使用结构而不是元组。