我正在尝试使用Elixir编写一个CLI客户端来连接API系统,以便我可以登录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
有没有什么方法可以解决这个问题?我考虑先解析地图并将所有字段小写,但我不想这样做。
为什么我不能为结构体使用大写键?虽然只要不尝试使用它们似乎是可以的。
packet."Token"
和packet."Data"
。 - Dogbert