我有一个已经具有@derive Jason.Encoder
的结构,但是该结构中的某些字段是元组,因此无法编码结构,我该如何修复:/
update
我使用了以下方法实现协议的方法。关于这种方法要注意的一件重要的事情是,它将改变整个项目的编码,请小心!
如果您确实需要将元组编码为列表类型,则有效:
defmodule TupleEncoder do
alias Jason.Encoder
defimpl Encoder, for: Tuple do
def encode(data, options) when is_tuple(data) do
data
|> Tuple.to_list()
|> Encoder.List.encode(options)
end
end
end
您应该能够根据需要使用类似的模式将其转换为另一个原始结构。
请查看如何实现encode/2
函数的文档:https://hexdocs.pm/jason/jason/jason/jason.encoder.html
作为实施的一部分,您需要确定要如何编码元组,因为它在JSON中没有模拟。数组可能是最简单的选择,因此您可以执行mytuple |> Tuple.to_list
我发现,如果元组包含具有原始defimpl扩展的元素(例如,用于mapset,range和stream的示例ONE(, @bxdoan的解决方案无效。我将其更改为:
defimpl Jason.Encoder, for: Tuple do
def encode(data, opts) when is_tuple(data) do
Jason.Encode.list(Tuple.to_list(data), opts)
end
end
效果更好。