我正在尝试在 Elixir 中为 API 编写 CLI 客户端,以便我可以登录 API 系统,获取计算所需的数据,然后注销。我已经定义了一个 Packet.Login 结构,它应该是我在解析收到的 JSON 后最终得到的内部数据结构。
我正在使用 Poison 来解析 JSON。问题在于,由于 API 返回大写属性,我在打印或解析时无法匹配它们,因为 Poison 将返回带有这些大写键的映射。问题是我似乎不可能像这样使用别名。如果我尝试使用另一种语法,
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
有没有办法让我以某种方式解决这个问题?我曾想过先解析地图并取消所有字段的大写,但我宁愿不这样做。
为什么我不能为结构设置大写键?似乎我可以,只要我不尝试使用它们。