如何自定义 Plug.Parsers JSON 解码器的选项?

Ada*_*hip 0 elixir json-deserialization plug

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

plug Plug.Parsers,
  parsers: [:json],
  json_decoder: Jason
Run Code Online (Sandbox Code Playgroud)

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

怎样才能给指定的选项提供呢json_decoder?例如,我想将keys: :atoms选项传递给Jason.decode!/2.

Ada*_*hip 5

除了模块名称之外,还可以传递{Module, :function, args}元组作为:json_decoder参数。这可用于自定义解码器的参数:

plug Plug.Parsers,
  parsers: [:json],
  json_decoder: {Jason, :decode!, [[keys: :atoms]]},
Run Code Online (Sandbox Code Playgroud)

这将导致解析器调用Jason.decode!(data, keys: :atoms).

列表[[]]中的语法有点奇怪,但由于Plug.Parsers处理合并选项的方式,它是必要的。出于同样的原因,另一种方法是在元组中提供空列表,并直接将选项包含为以下选项Plug.Parsers

plug Plug.Parsers,
  parsers: [:json],
  json_decoder: {Jason, :decode!, []},
  keys: :atoms
Run Code Online (Sandbox Code Playgroud)

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

  • 还应该提到这是有风险的,因为如果传入的请求不受某种方式控制,则原子可能会使系统过载。 (2认同)