1

我正在尝试对返回多个项目或单个项目的 API 调用使用相同的 HTTPoison 调用。多个项目的响应将它们放入“项目”属性中,而单个项目仅将项目信息作为 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 响应中的 items 属性,如果它不存在,则以不同的方式处理它?

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 回答