如何将Elixir Map转换为可用于Instagram/Slack URL的标准JSON?
解决Elixir Map转可用于URL的标准JSON字符串问题
我明白你遇到的困扰了——用Poison.encode!/1得到的结果在控制台显示带转义引号,直接拼URL会被API拒绝;IO.puts/1能输出正确格式但没法存成变量。其实这里有两个关键点要理清:
1. 先搞懂Poison.encode!/1的输出本质
Poison.encode!(%{key: 3})返回的本身就是正确的JSON二进制字符串,控制台里显示的"{\"key\":3}"只是Elixir对二进制的可视化方式,实际字符串内容就是{"key":3}。你可以通过写入文件验证:
json_str = Poison.encode!(%{key: "value"}) File.write!("test.json", json_str) # 打开test.json会看到内容是 {"key":"value"},完全符合JSON格式
2. 关键步骤:对JSON字符串做URL编码
API拒绝的原因不是JSON格式错了,而是直接把JSON字符串放到URL里时,其中的特殊字符(比如"、:)不符合URL规范,需要转成URL安全的编码格式。
你可以用Elixir标准库的URI.encode/2来处理:
# 1. 把Map转成JSON字符串 map = %{key: "value", count: 100} json_str = Poison.encode!(map) # 2. 对JSON字符串做URL编码,保留所有非特殊字符 encoded_json = URI.encode(json_str, &URI.char_unreserved?/1) # 3. 拼接成最终URL url = "http://example.com/endpoint&variables=#{encoded_json}"
这样生成的URL里,JSON的引号会被转成%22,冒号转成%3A,完全符合URL规范,API就能正确解析了。
额外小技巧:如果需要直接查看无转义的JSON字符串
如果你只是想在控制台看到和IO.puts一样的无转义输出,可以用inspect/2指定选项:
inspect(json_str, limit: :infinity, printable_limit: :infinity) # 会直接显示 {"key":"value","count":100}
内容的提问来源于stack exchange,提问作者Nema Ga
相关产品推荐
相关产品推荐

