【问题标题】:JSON slashes and backslashes in string on bourne shellbourne shell 上字符串中的 JSON 斜杠和反斜杠
【发布时间】:2017-03-02 02:27:53
【问题描述】:

我正在尝试解析在某些字符串中包含斜杠和反斜杠序列的 json 文件,如下所示:

echo '{"tag_string":"/\/\/\ test"}' | jq

这给了我:

parse error: Invalid escape at line 1, column 27

我尝试在不同位置使用反斜杠进行转义,但似乎找不到正确的方法。如何在不删除任何字符或出现错误的情况下按原样输出字符串?

这仅适用于 bash,但不适用于 sh(或 zsh):

echo '{"tag_string":"/\\/\\/\\ test"}' | jq -r '.tag_string'
/\/\/\ test

【问题讨论】:

  • 那么你有没有试过看看echo返回什么?
  • @zerkms 回显没有问题:{"tag_string":"/\/\/\ test"}
  • “没有问题”是什么意思?我的意思是让你得到它的输出并看到它不是有效的 JSON。获取它返回的任何内容并放入任何 JSON 验证器以获取详细信息。
  • @zerkms 我的意思是“没问题”,这就是我想要的最终输出,我已经知道它不是有效的 JSON。 jsonlint 给了我:Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got 'undefined',我在问这些字符必须如何转义才能没有错误。
  • @ae701 - 您的问题描述非常混乱,因为一方面您表示您有一些“JSON 文件”,但另一方面,您的示例与 shell 问题纠缠在一起。您是否有 JSON 文件,或者您是否正在尝试将一些非 JSON 文件转换为 JSON? ...

标签: json string escaping sh jq


【解决方案1】:

正斜杠字符是合法的,但单个反斜杠字符不是。根据json.org char 描述,有效字符为:

字符
    任何 Unicode 字符-
        除了-"-或-\-或-
        控制字符
    \"
    \\
    \/
    \b
    \F
    \n
    \r
    \t
    \u 四位十六进制数 

因此,在您的示例中,单反斜杠是不合法的,您需要将“\\”解释为双反斜杠,或者您需要完全删除它们。

【讨论】:

    【解决方案2】:

    如果您尝试包含文字反斜杠:

    (bash)

    echo '{"tag_string":"/\\/\\/\\ test"}' | jq
    {
      "tag_string": "/\\/\\/\\ test"
    }
    
    echo '{"tag_string":"/\\/\\/\\ test"}' | jq -r '.["tag_string"]'
    /\/\/\ test
    

    (sh)

    echo '{"tag_string":"/\\\\/\\\\/\\\\ test"}' | jq -r '.["tag_string"]'
    /\/\/\ test
    
    printf "%s" '{"tag_string":"/\\/\\/\\ test"}' | jq -r '.["tag_string"]'
    /\/\/\ test
    

    【讨论】:

    • 这失败并显示相同的消息:parse error: Invalid escape at line 1, column 27 和来自 npm 的 jsonlint 的 Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got 'undefined'
    • 编辑:这实际上适用于 bash,但不适用于 sh,这是我用于脚本的 shell。
    【解决方案3】:

    如果您尝试使用非 JSON 字符串转换文件,请考虑使用诸如 any-json 之类的工具。使用“cson-to-json”模式,“\/”会被解释为“/”:

    $ any-json -format=cson
    

    输入:

    {"tag_string":"/\/\/\ test"}
    

    输出:

    {
      "tag_string": "/// test"
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多