我有一个元组列表(代表一个http请求头),
在将其保存到数据库之前,我进行了检查
例如,原始值:
[{"Content-Type", "application/json"}, {"x-request-id", "fatlud3104arjj91jtig2qrj3u7320la"}]
保存为:
"[{\"Content-Type\", \"application/json\"}, {\"x-request-id\", \"fatlud3104arjj91jtig2qrj3u7320la\"}]"
有没有办法将这些值恢复到原始类型(从数据库加载时)?
答案 0 :(得分:2)
您可以使用Code.eval_string/1
。
这是一个管道,可以完整地进入和返回数据库。
[{"C", "json"}, {"x", "fa"}]
|> inspect
|> Code.eval_string
|> fn {recovered, []} -> recovered end.()
小心防止代码注入!!!
答案 1 :(得分:1)
你可以这样做一个解决方法:
your_string = "[{\"Content-Type\", \"application/json\"}, {\"x-request-id\", \"fatlud3104arjj91jtig2qrj3u7320la\"}]"
your_string
|> String.split(~r/\"?\"/)
|> Enum.filter(fn value -> value not in ["[{", ", ", "}, {", "}]"] end)
|> Enum.chunk_every(2)
|> Enum.map(fn [key, value] -> {key, value} end)
:D
答案 2 :(得分:1)
您可以使用:erlang.term_to_binary/1
对任何术语进行编码,并将其作为某些BLOB保存在数据库中:
iex(1)> t = [{"Content-Type", "application/json"}, {"x-request-id", "fatlud3104arjj91jtig2qrj3u7320la"}]
[
{"Content-Type", "application/json"},
{"x-request-id", "fatlud3104arjj91jtig2qrj3u7320la"}
]
iex(3)> encoded = :erlang.term_to_binary(t)
<<131, 108, 0, 0, 0, 2, 104, 2, 109, 0, 0, 0, 12, 67, 111, 110, 116, 101, 110,
116, 45, 84, 121, 112, 101, 109, 0, 0, 0, 16, 97, 112, 112, 108, 105, 99, 97,
116, 105, 111, 110, 47, 106, 115, 111, 110, 104, 2, 109, 0, ...>>
然后使用binary_to_term/1
获取您的列表:
iex(4)> :erlang.binary_to_term(encoded)
[
{"Content-Type", "application/json"},
{"x-request-id", "fatlud3104arjj91jtig2qrj3u7320la"}
]
如果您不想保存二进制文件,而是保存文本,则可以使用Base64对其进行编码
iex(4)> t |> :erlang.term_to_binary() |> Base.encode64()
"g2wAAAACaAJtAAAADENvbnRlbnQtVHlwZW0AAAAQYXBwbGljYXRpb24vanNvbmgCbQAAAAx4LXJlcXVlc3QtaWRtAAAAIGZhdGx1ZDMxMDRhcmpqOTFqdGlnMnFyajN1NzMyMGxhag=="