Эликсир Феникс Парс JSON as Struct - PullRequest
0 голосов
/ 11 декабря 2019

Исходя из этого ответа , я знаю, как проанализировать JSON в структуре, используя Poison.decode/2:

defmodule User do
  @derive [Poison.Encoder]
  defstruct [:address]
end

defmodule Address do
  @derive [Poison.Encoder]
  defstruct [:street]
end

Poison.decode(response, as: %User{address: %Address{}})

Но как мне сказать Фениксу делать то же самое? Если я скажу ему, что моя конечная точка принимает JSON, он просто автоматически проанализирует ее на карте:

defmodule MyAppWeb.Router do
  use MyAppWeb, :router

  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/api/v1", MyAppWeb do
    pipe_through :api

    put "/endpoint", MyController, :put
  end
end

defmodule MyController do
  def put(conn, %{"_json" => map}) do
    # Here, `map` is already parsed as a map. How can I tell Phoenix to
    # parse it as a struct I choose like I can tell `Poison` to do so?
  end
end

1 Ответ

1 голос
/ 11 декабря 2019

В вашем endpoint.ex должны быть парсеры plug:

 plug Plug.Parsers,
    parsers: [:urlencoded, :multipart, :json],
    pass: ["*/*"],
    json_decoder: Poison

Удалите атом json, который должен отключить json парсер.

...