【问题标题】:Escape JSON in Mix shell echo command在 Mix shell echo 命令中转义 JSON
【发布时间】:2021-06-26 18:22:33
【问题描述】:

我有一个类似的代码。我希望它在属性上用引号回显一个有效的 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}

【问题讨论】:

    标签: elixir elixir-mix elixir-poison


    【解决方案1】:

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

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

    Ref

    【讨论】:

      【解决方案2】:

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

      这对我有用,给定一个简单的 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"
      

      【讨论】:

      • 我没听懂 - You shouldn't need to rely on the OS echo command when Elixir IO already ties into STDOUT.
      • 如何将 JSON 字符串通过管道传送到命令?
      • 我提供了一个将输出传送到jq 命令的示例(见上文)。 IO.puts 已写入 STDOUT,因此您无需使用 echo 或其他一些特定于操作系统的实用程序。
      • 嗯,该解决方案似乎还可以,但它不适用于我的代码。上面的代码是一个长时间运行的应用程序的一部分,所以我不能使用和管道运行脚本的输出。
      • 你的意思是你的代码中有其他IO.puts 语句,所以你有其他东西被写入STDOUT?也许您应该改用Logger,这样您就可以更好地控制它。取而代之的是,是的,在您发布时引用您的价值。
      猜你喜欢
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 2021-07-22
      • 2012-02-06
      • 1970-01-01
      • 2020-02-13
      相关资源
      最近更新 更多