2016-07-09 21 views

risposta

12

Phoenix.Controller.json/2 attualmente non accetta opzioni che potrebbero essere passate al codificatore JSON.

Se si desidera rendere globalmente tutte le chiamate json piuttosto JSON, è possibile creare un wrapper attorno a Poison e indicare a Phoenix di utilizzarlo.

In lib/my_app/pretty_poison_encoder_for_phoenix.ex, aggiungere:

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

E in config/config.exs, aggiungere:

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

Dopo aver riavviato il server, tutte le chiamate json dovrebbero stampare automaticamente abbastanza JSON.

Se si desidera un output piuttosto buono in dev, è possibile invece aggiungere il codice sopra riportato in config/dev.exs. Se lo fai, prod continuerà a produrre JSON non grazioso.


È possibile anche creare un semplice wrapper che fa quello Phoenix.Controller.json/2 fa (quasi; vedi nota sotto), ma rende anche l'uscita abbastanza:

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 

Usage:

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

uscita :

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

Nota: questo non è esattamente equivalente a Phoenix.Controller.json/2 poiché tale funzione aggiunge solo il tipo di contenuto se uno non è presente. È possibile utilizzare la stessa logica copiando un codice da here.

Problemi correlati