2016-07-09 11 views

Antwort

12

Phoenix.Controller.json/2 akzeptiert derzeit keine Optionen, die an den JSON-Encoder übergeben werden könnten.

Wenn Sie möchten, dass alle json Aufrufe ziemlich JSON ausgeben, können Sie einen Wrapper um Poison erstellen und Phoenix anweisen, es zu verwenden.

In lib/my_app/pretty_poison_encoder_for_phoenix.ex hinzu:

defmodule MyApp.PrettyPoisonEncoderForPhoenix do 
    def encode_to_iodata!(data) do 
    Poison.encode_to_iodata!(data, pretty: true) 
    end 
end 

Und in config/config.exs hinzu:

config :phoenix, :format_encoders, json: MyApp.PrettyPoisonEncoderForPhoenix 

Nach dem Neustart des Servers, alle Ihre json Anrufe automatisch ziemlich JSON drucken.

Wenn Sie nur eine hübsche Ausgabe in dev möchten, können Sie stattdessen den obigen Code in config/dev.exs hinzufügen. Wenn Sie das tun, wird prod weiterhin nicht-hübsch JSON ausgeben.


Sie können auch einen einfachen Wrapper erstellen, die das tut, was Phoenix.Controller.json/2 tut (fast, siehe Hinweis unten), sondern macht auch die Ausgabe recht:

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 

Verbrauch:

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

Ausgang :

➜ curl localhost:4000 
[ 
    { 
    "b": 2, 
    "a": 1 
    }, 
    { 
    "d": 4, 
    "c": 3 
    } 
] 

Hinweis: Dies entspricht nicht genau Phoenix.Controller.json/2, da diese Funktion nur den Inhaltstyp hinzufügt, wenn einer nicht vorhanden ist. Sie können dieselbe Logik verwenden, indem Sie einen Code aus here kopieren.