You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:55:55