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
该函数仅添加内容类型(如果不存在).您可以通过从此处复制一些代码来使用相同的逻辑.