问题描述
我得到的消息是,从纯粹的意义上讲,JSON并不代表元组,但我认为就JSON编码而言,将元组视为列表是不合理的。 \是否还有其他人面对并解决了这个问题?我想不进行预处理错误数据以用列表替换元组的事。
也许我需要指定一种不同的序列化方法?
编辑:这是一个实际示例:
这是一些玩具代码。
the_data = {:ok,%{...}}
Sentry.capture_message(message,the_data)
它所做的只是尝试向Sentry发送一条包含元数据的消息。
如果您不熟悉Sentry,则sendry-elixir库提供了两个函数(当然还有许多其他函数),用于显式地将异常或消息发送给Sentry。这些功能是:
Sentry.capture_exception/2
Sentry.capture_message/2
此外,错误在冒泡到“顶部”时会发送到Sentry。这些不能被拦截,因此我必须在Sentry的配置中指定(并实现)一个before_send_event
“处理程序”。
这是我在工作环境中的配置:
config :sentry,dsn: "https://my_neato[email protected]/33333343",environment_name: :staging,enable_source_code_context: true,root_source_code_path: File.cwd!(),tags: %{
env: "staging"
},before_send_event: {SomeApplication.Utils.SentryLogger,:before_send},included_environments: [:staging],filter: SomeApplication.SentryEventFilter
我的before_send
函数基本上会尝试对数据进行完整性检查,并用列表替换所有元组。不过,我还没有完全实现这一点,因此我暂时不使用Kernel.inspect/2
来替换所有元组,而是将其转换为字符串。当然这不是理想的,因为它们使我无法处理Sentry视图中的数据:
def before_send(sentry_event) do
IO.puts "------- BEFORE SEND TWO ---------------------------"
sentry_event
|> inspect(limit: :infinity)
end
这将产生以下输出:
{:invalid,{:ok,the_data}}
capture_message失败。
解决方法
默认情况下,sentry
使用jason
对其JSON进行编码,同样,默认情况下,jason
不对元组进行编码。您可以通过为Jason.Encoder
实现Tuple
来改变它:
defimpl Jason.Encoder,for: Tuple do
def encode(tuple,opts) do
Jason.Encode.list(Tuple.to_list(tuple),opts)
end
end
请注意-这将对在应用程序中将元组转换为JSON产生全局影响。