让Phoenix Controller输出漂亮的JSON

时间:2016-07-09 04:19:00

标签: elixir phoenix-framework

有没有办法让Phoenix.Controller.json(conn, data)输出漂亮的JSON?

1 个答案:

答案 0 :(得分:13)

Phoenix.Controller.json/2目前不接受可以传递给JSON编码器的选项。

如果你想全局地使所有json调用输出相当JSON,你可以创建一个Poison的包装器并告诉Phoenix使用它。

lib/my_app/pretty_poison_encoder_for_phoenix.ex中,添加:

defmodule MyApp.PrettyPoisonEncoderForPhoenix do
  def encode_to_iodata!(data) do
    Poison.encode_to_iodata!(data, pretty: true)
  end
end

config/config.exs中,添加:

config :phoenix, :format_encoders, json: MyApp.PrettyPoisonEncoderForPhoenix

重新启动服务器后,所有json个调用都应自动打印相当的JSON。

如果您只想在dev中输出漂亮的输出,则可以在config/dev.exs中添加上述代码。如果你这样做,prod仍将输出非漂亮的JSON。

您还可以创建一个简单的包装器来执行Phoenix.Controller.json/2所做的事情(几乎;请参阅下面的注释),但也会使输出漂亮:

def pretty_json(conn, data) do
  conn
  |> put_resp_header("content-type", "application/json; charset=utf-8")
  |> send_resp(200, Poison.encode!(data, pretty: true))
end

用法:

def index(conn, _params) do
  pretty_json conn, [%{a: 1, b: 2}, %{c: 3, d: 4}]
end

输出:

➜ curl localhost:4000
[
  {
    "b": 2,
    "a": 1
  },
  {
    "d": 4,
    "c": 3
  }
]

注意:这与Phoenix.Controller.json/2不完全等效,因为该函数仅添加内容类型(如果不存在)。您可以通过从here复制一些代码来使用相同的逻辑。