让Phoenix Controller输出漂亮的JSON

Ale*_*hin 7 elixir phoenix-framework

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

Dog*_*ert 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
Run Code Online (Sandbox Code Playgroud)

并在config/config.exs,添加:

config :phoenix, :format_encoders, json: MyApp.PrettyPoisonEncoderForPhoenix
Run Code Online (Sandbox Code Playgroud)

重新启动服务器后,您的所有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
Run Code Online (Sandbox Code Playgroud)

用法:

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

输出:

? curl localhost:4000
[
  {
    "b": 2,
    "a": 1
  },
  {
    "d": 4,
    "c": 3
  }
]
Run Code Online (Sandbox Code Playgroud)

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