我正在嘗試在API中編寫一個CLI客戶端,以便我可以登錄API系統,獲取我需要的數據,然後註銷。我已經定義了一個Packet.Login結構,該結構應該是我的內部數據結構,在解析我接收到的JSON後,我將結束這個結構。Elixir - 結構中的大寫字母鍵
我正在使用Poison來解析JSON。問題在於,由於API返回大寫屬性,因此在打印或解析時我無法匹配它們,因爲毒藥將返回帶有這些大寫鍵的映射。問題是,我似乎不可能像這樣使用別名。如果我嘗試使用另一種語法,
packet[:Token]
它仍然不起作用,而是給我一個錯誤。但是這次關於Packet.Login沒有實現Access行爲。我可以理解這一部分,但不是第一個問題。我試圖讓代碼很簡單。
defmodule Packet.Login do
defstruct [:Data, :Token]
end
defimpl String.Chars, for: Packet.Login do
def to_string(packet) do
"Packet:\n---Token:\t\t#{packet.Token}\n---Data:\t#{packet.Data}"
end
end
loginPacket = Poison.decode!(json, as: %Packet.Login{})
IO.puts "#{loginPacket}"
當試圖編譯上面我得到這個:
** (CompileError) lib/packet.ex:31: invalid alias: "packet.Token". If you wanted to define an alias, an alias must expand to an atom at compile time but it did not, you may use Module.concat/2 to build it at runtime. If instead you wanted to invoke a function or access a field, wrap the function or field name in double quotes
(elixir) expanding macro: Kernel.to_string/1
有沒有辦法,我以某種方式解決這一問題?我曾想過解析地圖並首先將所有字段去掉大寫,但我寧願不要。
爲什麼我不能有一個結構的大寫鍵?但似乎我可以,只要我不嘗試使用它們。
嘗試'包「令牌」'和'包「數據」'。 。 – Dogbert
哇。是的,這工作。那麼,關鍵字是一個字符串呢?我想解釋爲什麼這是必要的。 – Simon
@Dogbert作出並回答解釋爲什麼我可以接受答案(鑑於解釋足夠的解釋):) – Simon