使用Plug.Parsers
,可以配置用于解析 JSON 请求的模块:
plug Plug.Parsers,
parsers: [:json],
json_decoder: Jason
但是,使用此语法Jason.decode!/2
调用空opts
参数。
我们如何为指定的选项提供选项json_decoder
?例如,我想将keys: :atoms
选项传递给Jason.decode!/2
.
使用Plug.Parsers
,可以配置用于解析 JSON 请求的模块:
plug Plug.Parsers,
parsers: [:json],
json_decoder: Jason
但是,使用此语法Jason.decode!/2
调用空opts
参数。
我们如何为指定的选项提供选项json_decoder
?例如,我想将keys: :atoms
选项传递给Jason.decode!/2
.
除了模块名称之外,还可以传递一个{Module, :function, args}
元组作为:json_decoder
参数。这可用于自定义解码器的参数:
plug Plug.Parsers,
parsers: [:json],
json_decoder: {Jason, :decode!, [[keys: :atoms]]},
这将导致解析器调用Jason.decode!(data, keys: :atoms)
.
[[]]
list-in-a-list 语法有点奇怪,但由于Plug.Parsers
处理合并选项的方式,它是必要的。出于同样的原因,另一种方法是在元组中提供空列表,并直接将选项作为选项包含到Plug.Parsers
:
plug Plug.Parsers,
parsers: [:json],
json_decoder: {Jason, :decode!, []},
keys: :atoms
我更喜欢前者,因为选项的范围更好,但如果某些解析器共享公共参数,后者可能会很有用。