1

複数のアイテムまたは単一のアイテムを返す API 呼び出しに同じ HTTPoison 呼び出しを使用しようとしています。複数のアイテムの応答はそれらを「items」プロパティにスローしますが、単一のアイテムはアイテム情報を JSON 文字列として返すだけです。

これが私のコードです:

  def process_url(method, id \\ 0) do
    if id > 0 do
      "http://api.call.com/#{method}/#{id}?key=API_KEY"
    else
      "http://api.call.com/#{method}?key=API_KEY"
    end
  end

  def process_response_body(body) do
    body
    |> Poison.decode!(as: %{"items" => [%Item{}]})
    |> Map.fetch!("items")
  end

process_response_body で、JSON 応答の項目プロパティを確認し、存在しない場合は別の方法で処理するにはどうすればよいですか?

4

1 に答える 1

2

結果をデコードし、マルチヘッド関数を記述してオブジェクトにパックするだけです。何かのようなもの:

def process_response_body(body) do
  body
  |> Poison.decode!
  |> unpack
end

def unpack(%{"items" => items}) do
  Enum.map(items, &struct(Item, &1))
end
def unpack(%{"item" => item}), do: struct(Item, item)

またはケース付き:

body
|> Poison.decode!
|> case do
  %{"items" => items} -> Enum.map(items, &struct(Item, &1))
  %{"item" => item} -> struct(Item, item)
end
于 2016-07-05T00:57:32.863 に答える