解决方法
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中的某些代码来使用相同的逻辑.