使用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)
。
[[]]
in-a-list语法有点奇怪,但是由于Plug.Parsers
处理合并选项的方式,这是必要的。出于同样的原因,另一种方法是在元组中提供空列表,并将选项直接作为Plug.Parsers
的选项:
plug Plug.Parsers,
parsers: [:json],
json_decoder: {Jason, :decode!, []},
keys: :atoms
我更喜欢前者,因为选项更好,但是如果某些解析器共享共同参数,则后者可能很有用。