gpt4 book ai didi

json - Elixir - 结构中的大写键

转载 作者:行者123 更新时间:2023-12-01 11:20:56 25 4
gpt4 key购买 nike

我正在尝试在 Elixir 中为 API 编写一个 CLI 客户端,以便我可以登录到 API 系统,获取计算所需的数据,然后注销。我已经定义了一个 Packet.Login 结构,它应该是我在解析收到的 JSON 后最终得到的内部数据结构。

我正在使用 Poison 来解析 JSON。问题是,由于 API 返回大写属性,我无法在打印或解析时匹配它们,因为 Poison 将返回带有这些大写键的映射。问题是我似乎不可能使用这样的别名。如果我尝试使用另一种语法,

packet[:Token]

它仍然不起作用,而是给我一个错误。但是这次关于 Packet.Login 没有实现访问行为。我能理解那部分,但不是第一个问题。我正在努力使代码保持简单。

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

有什么办法可以解决这个问题吗?我曾想过先解析 map 并取消所有字段的大写字母,但我宁愿不这样做。

为什么我不能为结构设置大写键?看来我可以,只要我不尝试使用它们。

最佳答案

为了访问以大写字母开头的原子映射字段,您需要将键放在引号中,例如foo."Bar"或使用括号语法,例如foo[:Bar] . foo.Bar在 Elixir 中被解析为别名。对于结构,您不能使用括号语法,因此最简单的方法是在字段名称周围使用引号。因此,在您的代码中,您需要更改:

"Packet:\n---Token:\t\t#{packet.Token}\n---Data:\t#{packet.Data}"

到:

"Packet:\n---Token:\t\t#{packet."Token"}\n---Data:\t#{packet."Data"}"

我无法在任何地方找到清楚的记录,但 Elixir 的来源提到了这个 in some places并使用此语法访问 :erlang 中的某些函数其名称在 Elixir 中不是有效的标识符,例如 :erlang."=<" .


有趣的事实:您可以在 Elixir 中定义只能使用这种引号语法调用的函数:

iex(1)> defmodule Foo do
...(1)> def unquote(:"!@#")(), do: :ok
...(1)> end
iex(2)> Foo."!@#"()
:ok

关于json - Elixir - 结构中的大写键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43375707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com