1

我有一个类似的代码。我希望它在属性上用引号回显一个有效的 JSON,以便它可以通过管道传输到另一个命令。但是,在呼应的同时,它正在扯掉所有的报价。

def test_function() do
  map = %{
    "key1" => 12,
    "key2" => "value1",
  }

  json = Poison.encode!(map)
  IO.inspect(json)

  Mix.Shell.cmd(
    "echo #{json}",
    fn x -> IO.puts(x) end
  )
end

预期的

{"key2":"value1","key1":12}

实际的

{key2:value1,key1:12}
4

2 回答 2

1

echo当 ElixirIO已经绑定到 STDOUT时,您不需要依赖 OS命令。我认为您可能在这里遇到了麻烦,因为您将(包装在系统命令中)的结果IO.inspect和结果发送到,所以它使事情加倍,至少,这令人困惑,但它也可能是无效的.IO.putsechoSTDOUT

这对我有用,给定一个包含的简单github.json文件

{
    "sha": "d25341478381063d1c76e81b3a52e0592a7c997f",
    "commit": {
        "author": {
            "name": "Stephen Dolan",
            "email": "mu@netsoc.tcd.ie",
            "date": "2013-06-22T16:30:59Z"
        }
    },
    "url": "https://api.github.com/repos/stedolan/jq/commits/d25341478381063d1c76e81b3a52e0592a7c997f"
}

parse.exs与以下脚本一起存储:

contents = File.read!("github.json")
map = Jason.decode!(contents)

json_str = Jason.encode!(map)
IO.puts(json_str)

这种解码和编码表明这是有效的(替代Poison或任何需要的)。

现在,我可以通过运行以下命令mix run parse.exs并看到预期的结果。我还可以按预期通过管道输出,例如jq

❯ mix run parse.exs | jq '.sha'
"d25341478381063d1c76e81b3a52e0592a7c997f"
于 2021-03-30T18:31:15.243 回答
1

我必须用单引号引用 JSON 字符串

Mix.Shell.cmd(
  "echo '#{json}'",
  fn x -> IO.puts(x) end
)

参考

于 2021-03-30T18:40:01.490 回答