【问题标题】:Unable to return encode :date types in Poison无法返回编码:毒药中的日期类型
【发布时间】:2015-03-27 21:54:06
【问题描述】:

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

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

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

【问题讨论】:

  • 要记住的一件事——“{”和“}”是 JSON 中的保留字符。我猜你需要逃避它们或找出一些方法来从值中获取年、月和日期。

标签: elixir phoenix-framework


【解决方案1】:

您的“日期对象”只是一个 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\""}

希望这会有所帮助。

【讨论】:

  • 我的结构可能有点不同: :io_lib.format("~4..0B-~2..0B-~2..0B", [2015, 3, 24] ) |> List.flatten |> to_string |> Poison.encode
  • 您不使用字符串插值而不是 :io_lib.format/2 是否有特殊原因?
  • @whatyouhide 没有充分的理由,不。显然,任何一个都可以。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    感谢上面的 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。谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-07
      • 2017-09-19
      • 2017-10-27
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      相关资源
      最近更新 更多