Czy jest jakiś sposób, aby Phoenix.Controller.json(conn, data)
wygenerować ładny JSON?Spraw, aby kontroler Phoenix wyprowadzał ładną JSON
Odpowiedz
Phoenix.Controller.json/2
aktualnie nie akceptuje opcji, które można przekazać do kodera JSON.
Jeśli chcesz, aby wszystkie wywołania json
generowały ładną wartość JSON, możesz utworzyć opakowanie o numerze Poison
i poinformować Phoenix, aby z niego korzystał.
W lib/my_app/pretty_poison_encoder_for_phoenix.ex
, dodać:
defmodule MyApp.PrettyPoisonEncoderForPhoenix do
def encode_to_iodata!(data) do
Poison.encode_to_iodata!(data, pretty: true)
end
end
I config/config.exs
dodać:
config :phoenix, :format_encoders, json: MyApp.PrettyPoisonEncoderForPhoenix
Po ponownym uruchomieniu serwera, wszystkie rozmowy json
powinien automatycznie drukować ładny JSON.
Jeśli chcesz tylko ładne wyjście w dev
, możesz zamiast tego dodać powyższy kod w config/dev.exs
. Jeśli to zrobisz, prod
nadal będzie generować niezły kod JSON.
Można również stworzyć prosty wrapper, który robi co Phoenix.Controller.json/2
robi (prawie; patrz uwaga poniżej), ale także sprawia, że wyjście dość:
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
Zastosowanie:
def index(conn, _params) do
pretty_json conn, [%{a: 1, b: 2}, %{c: 3, d: 4}]
end
Output :
➜ curl localhost:4000
[
{
"b": 2,
"a": 1
},
{
"d": 4,
"c": 3
}
]
Uwaga: To nie jest dokładnie równoważne z Phoenix.Controller.json/2
, ponieważ ta funkcja dodaje tylko typ zawartości, jeśli nie jest obecny. Możesz użyć tej samej logiki, kopiując kod z here.