无法 return 在 Poison 中编码 :date 类型
Unable to return encode :date types in Poison
我在 Phoenix 中使用默认的 json 工具,但由于某些原因我不能 return 任何日期(字段类型:日期)。我得到这样的东西:
unable to encode value: {2015, 3, 24}
我正在使用 postgres 数据库,数据库中的字段类型为日期。我错过了什么吗?在用毒药编码之前,我是否需要构建一个函数来解析日期?
您的 "date object" 只是一个 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\""}
希望这对您有所帮助。
感谢上面的 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 之前,这些函数在我的视图中可用以进行格式化。谢谢!
这将在下一个 Phoenix 版本 (v0.11) 中变得更好:
新的 Phoenix 版本将通过 phoenix_ecto 项目自动包含 Ecto.DateTime
和 Ecto.Date
的编码器。所以它应该可以正常工作™。
就是说,您可能希望使用 Ecto.DateTime
、Ecto.Date
和朋友而不是 :datetime
和 :time
,因为您将使用结构而不是元组。
我在 Phoenix 中使用默认的 json 工具,但由于某些原因我不能 return 任何日期(字段类型:日期)。我得到这样的东西:
unable to encode value: {2015, 3, 24}
我正在使用 postgres 数据库,数据库中的字段类型为日期。我错过了什么吗?在用毒药编码之前,我是否需要构建一个函数来解析日期?
您的 "date object" 只是一个 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\""}
希望这对您有所帮助。
感谢上面的 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 之前,这些函数在我的视图中可用以进行格式化。谢谢!
这将在下一个 Phoenix 版本 (v0.11) 中变得更好:
新的 Phoenix 版本将通过 phoenix_ecto 项目自动包含
Ecto.DateTime
和Ecto.Date
的编码器。所以它应该可以正常工作™。就是说,您可能希望使用
Ecto.DateTime
、Ecto.Date
和朋友而不是:datetime
和:time
,因为您将使用结构而不是元组。