有没有办法让Phoenix.Controller.json(conn, data)
输出漂亮的JSON?
答案 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复制一些代码来使用相同的逻辑。