带有粗箭头与冒号的映射(毒药 - json 解码)

Map with fat arrow vs colon (Poison - json decode)

ab = %{a: 1}
ac = %{"a" => 1}

具体有什么区别?为什么 Poison.decode! return 格式 #2(我需要 #1 才能与 Ecto.Changeset.change 一起使用)。

Json 响应取自 API,看起来像

[{"a":3}]
ab = %{a: 1} # atom key you can access it like ab.a
ac = %{"a" => 1} # string key you can access it ac["a"]

Poison.decode! return 格式 #2:

从广义上讲,来自应用程序外部的数据是不可信任的。鉴于 atom 分配会导致 long-运行 Erlang 系统中的内存耗尽,将 atom 用于外部数据会使您的应用程序面临潜在的拒绝服务 (DoS) 攻击。

这个事实反映在许多 Elixir 库中,例如流行的 JSON 解析器 Poison。行为良好的库在将外部数据转换为内部数据结构时通常会使用字符串作为映射键

如果你想将映射键从字符串转换为 atom.You 可以这样做:

iex> maps = %{"foo" => "bar"}
%{"foo" => "bar"}
iex> for {key, val} <- maps, into: %{}, do: {String.to_atom(key), val}
%{foo: "bar"}