如何自定义插件的选项.ParsersJSON解码器



使用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

我更喜欢前者,因为选项更好,但是如果某些解析器共享共同参数,则后者可能很有用。

最新更新