问题描述
我正在尝试一种干净的方法来覆盖二进制文件的Jason Encoder,这将允许我从二进制文件中提取UUID。从理论上讲,这是我想要做的:
defimpl Jason.Encoder,for: BitString do
def encode(binary,opts) when is_binary(binary) do
with false <- String.valid?(binary),{:ok,uid} <- Ecto.UUID.cast(binary) do
uid
else
_ -> Jason.Encode.string(binary,opts)
end
end
def encode(bitstring,_opts) do
raise Protocol.UndefinedError,protocol: @protocol,value: bitstring,description: "cannot encode a bitstring to JSON"
end
end
我正在考虑使用this stackoverflow示例,除了我认为这里的问题是像BitString这样的本机类型不能被覆盖。
解决方法
您可以尝试将UUID包装在其自己的结构中,并为该结构实现BitString
协议,而不是尝试全局覆盖Jason.Encoder
的协议:
defmodule JsonUUID do
defstruct [:uuid]
defimpl Jason.Encoder do
def encode(%JsonUUID{uuid: uuid},opts) when is_binary(uuid) do
uuid
|> Ecto.UUID.cast!()
|> Jason.Encode.string(opts)
end
end
end
测试:
Jason.encode!(%JsonUUID{uuid: Ecto.UUID.bingenerate()})
=> "\"8cbf3df9-8408-4ce3-ac44-980a0f7dc19b\""