【问题标题】:Can I pass a string variable to jq not the file?我可以将字符串变量传递给 jq 而不是文件吗?
【发布时间】:2018-04-16 18:13:27
【问题描述】:

我想在 bash 中将 JSON 字符串转换为数组。 JSON 字符串作为参数传递给 bash 脚本(文件中不存在)。

有没有办法在不使用一些临时文件的情况下实现它?

与此类似:

script.sh

#! /bin/bash
json_data='{"key":"value"}'
jq '.key' $json_data

jq: error: Could not open file {key:value}: No such file or directory

【问题讨论】:

    标签: json bash variables input jq


    【解决方案1】:

    我建议使用 bash here string。例如

    jq '.key' <<< "$json_data"
    

    【讨论】:

    • 如何使用两个字符串而不是两个文件,这样我才能使用jq -s '.[0] * .[1]' file1 file2
    • @KatieS:使用新的 bash 变量连接两个字符串,然后传递它。
    • 你如何将结果传递给其他东西?
    • 或许jq '.key' &lt;&lt;&lt; "$json_data" | something else
    【解决方案2】:

    原始问题中给出的变量“json_data”的值不是有效的 JSON,因此此响应仍然涵盖两种情况(几乎有效和有效的 JSON)。

    有效的 JSON

    如果“$json_data”确实包含一个有效的 JSON 值,那么这里有两个本页其他地方没有提到的替代方案。

    --argjson

    例如:

     jq -n --argjson data "$json_data" '$data.key'
    

    env

    如果 shell 变量不是环境变量:

    json_data="$json_data" jq -n 'env.json_data | fromjson.key'
    

    几乎有效的 JSON

    如果 $json_data 确实 invalid 作为 JSON 但作为 jq 表达式有效,那么您可以采用以下脚本所示的策略:

    $ json_data='{key:"value"}'
    $ jq -n "$json_data" | jq .key
    "value"
    

    【讨论】:

    • 我的意思是“键”是字符串类型。可能应该使用“名称”这个词。
    • 无论如何,这两个示例都对我有用(mac 上的 bash),即使使用引用的“key”并产生与 jq170727 解决方案中的 here 字符串类似的结果。
    • 对于其他不需要密钥搜索的人:只需jq -n $json_data。如此简单,但是对于这样一个简单的场景,文档和在线示例都非常不清楚。他们似乎都认为你想做一些复杂的事情。
    【解决方案3】:

    使用 bash:echo "$json_data" | jq '.key'

    【讨论】:

      【解决方案4】:

      当然。只需将 bash 告诉 give it a file instead

      jq '.key' <(echo "$json_data")
      

      并确保你在 bash 中运行它,而不是 sh。

      【讨论】:

        【解决方案5】:

        如果你想使用内联命令,我在我的 Mac 上发现了这项工作:

        echo '{"key":"value"}' | jq .key
        

        【讨论】:

        • 将结果存储在一个变量中以供以后阶段使用。假设您的 json 已经在一个变量中,并且您需要另一个变量中的结果。 jsonData="{"key":"value"}" result=$(echo $jsonData | jq -r '.key') echo $result 将产生价值作为结果。
        【解决方案6】:
        #! /bin/bash
        json_data='{"key":"value"}'
        echo $json_data | jq --raw-output '.key'
        

        【讨论】:

          【解决方案7】:

          如果您尝试在 .sh 文件中执行此操作,这对我有用:

          local json_data $(getJiraIssue "$1")               # store JSON in var
          echo `jq -n "$json_data" | jq '.fields.summary'`   # pass that JSON var to jq
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-16
            • 2017-11-14
            相关资源
            最近更新 更多