ab = %{a: 1}
ac = %{"a" => 1}
違いは正確には何ですか?そして、なぜ Poison.decode は! フォーマット #2 を返します (Ecto.Changeset.change で使用するには #1 が必要です)。
Json 応答は API から取得され、次のようになります。
[{"a":3}]
ab = %{a: 1}
ac = %{"a" => 1}
違いは正確には何ですか?そして、なぜ Poison.decode は! フォーマット #2 を返します (Ecto.Changeset.change で使用するには #1 が必要です)。
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"]
ポイズン.デコード! 戻り形式 #2:
大まかに言えば、アプリケーションの外部からのデータは信頼できません。アトムの割り当てが実行時間の長い Erlang システムでメモリの枯渇につながる可能性があることを考えると、外部データにアトムを使用すると、サービス拒否 (DoS) 攻撃に対してアプリが開かれます。
この事実は、人気のある JSON パーサーPoisonなど、多くの Elixir ライブラリに反映されています。通常、行儀の良いライブラリは、外部データを内部データ構造に変換するときに文字列をマップ キーとして使用します。
マップ キーを文字列からアトムに変換する場合は、次のようにします。
iex> maps = %{"foo" => "bar"}
%{"foo" => "bar"}
iex> for {key, val} <- maps, into: %{}, do: {String.to_atom(key), val}
%{foo: "bar"}