0

使用Plug.Parsers,可以配置用于解析 JSON 请求的模块:

plug Plug.Parsers,
  parsers: [:json],
  json_decoder: Jason

但是,使用此语法Jason.decode!/2调用空opts参数。

我们如何为指定的选项提供选项json_decoder?例如,我想将keys: :atoms选项传递给Jason.decode!/2.

4

1 回答 1

4

除了模块名称之外,还可以传递一个{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

我更喜欢前者,因为选项的范围更好,但如果某些解析器共享公共参数,后者可能会很有用。

于 2019-08-02T05:32:20.137 回答