6

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

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

我正在使用带有日期类型数据库中的字段的 postgres 数据库。我错过了什么吗?在用毒药编码之前,我是否需要构建一个函数来解析日期?

4

3 回答 3

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\""}

希望这可以帮助。

于 2015-03-26T14:51:39.910 回答
2

这将在下一个 Phoenix 版本(v0.11)中变得更好:

  1. 新的 Phoenix 版本将通过phoenix_ecto项目自动包含编码器Ecto.DateTime。所以它应该只是工作™。Ecto.Date

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

于 2015-03-27T13:54:06.630 回答
1

感谢上面的 Jordan Dimov,我最终制作了一个名为 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 模块中的 :view 下为模块起别名,因此在返回 Json 之前,这些函数可以在我的视图中进行格式化。谢谢!

于 2015-03-26T23:43:33.470 回答