簡體   English   中英

毒物:無法編碼價值

[英]Poison : unable to encode value

我無法對從Ecto查詢結果中毒編碼方法獲得的值進行編碼

控制器代碼:

def companies(conn, params) do
    companies = Repo.all(
      from(
        c in Company,
        select: {c.name, c.uid},
        limit: 20
      )
    ) 

    conn
    |> put_resp_header("content-type", "application/json; charset=utf-8")
    |> send_resp(200, Poison.encode!(companies, pretty: true))
end

模板代碼:

<div class="form-group row">
  <%= label f, :company_id, class: "control-label" %>
  <%= select f, :company_id, @companies, class: "form-control"%>
<%= error_tag f, :company_id %>

錯誤信息:

Request: GET /companies
** (exit) an exception was raised:
    ** (Poison.EncodeError) unable to encode value: {"Loews Corporation", 1000285930}
        (poison) lib/poison/encoder.ex:383: Poison.Encoder.Any.encode/2
        (poison) lib/poison/encoder.ex:268: anonymous fn/4 in Poison.Encoder.List.encode/3
        (poison) lib/poison/encoder.ex:269: Poison.Encoder.List."-encode/3-lists^foldr/2-0-"/3
        (poison) lib/poison/encoder.ex:269: Poison.Encoder.List.encode/3
        (poison) lib/poison.ex:41: Poison.encode!/2

Poison無法將元組編碼為JSON值。 如果要在結果JSON中使用[{name: ..., uid: ...}, {name: ..., uid: ...}] ,則可以在select中使用map()或地圖文字查詢:

select: map(c, [:name, :uid])

要么

select: %{name: c.name, uid: c.uid}

添加到@Dogbert的答案:您還可能通過從Ecto手動返回的內容中生成map來生成JSON對象:

companies =
  from(c in Company, select: {c.name, c.uid}, limit: 20)
  |> Repo.all()     # returning list of tuples
  |> Enum.into(%{}) # this

#⇒ %{"Loews Corporation" => 1000285930, "Foo" => 1, "Bar" => 2}

可以使用Poison將地圖編碼為JSON,從而生成JS對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM