使用JQ解析JSON

使用JQ解析JSON

我正在使用 Bash 在 Linux 机器上运行以下脚本片段。

JSON 文件内容:[ { "id": 123456, "firstName": "John", "lastName": "Smith", "email": "[email protected]" } ]


JSON 文件存储在通过${data[0]}管道传输到 Bash 脚本的数组中。


重击脚本:

trafficEmployeeId=123456 cat "${data[0]}" | jq --arg employeeId $trafficEmployeeId '.[] | select(.id == $employeeId) | .firstName'


脚本的输出应该是John.但我什么也没得到。

答案1

即使你trafficEmployeeId用 a指定了 shell 变量数字它将jq作为细绳争论。
解决方案是将参数解析为数字杰克tonumber功能。
第二个时刻是data[0]包含只有一个对象的数组,因此直接使用.[0]并应用简单的if运算符条件就足够了。

完整的解决方案:

trafficEmployeeId=123456
echo "${data[0]}" | jq --arg employeeId "$trafficEmployeeId" '.[0] 
      | if .id == ($employeeId | tonumber) then .firstName else empty end'

输出:

"John"

答案2

代码中的主要问题是您将其作为参数进行cat调用。${data[0]}这将导致cat尝试打开以此作为文件名的文件。这可能就是您所说的“JSON 文件存储在数组中${data[0]}”的意思,但如果这意味着该文件是字面上地存储在数组中,那么您需要使用printf将该数据传递给jq.

当您尝试将数字(在 JSON 文档中)与字符串(表达式$employeeId中的值jq)进行比较时,还有一个额外的问题。通过使用--argjson代替可以轻松解决此问题--arg。使用--argjsonjq假设您创建的变量的值已经进行了适当的 JSON 编码。

你修改后的脚本变成

#!/bin/sh

id=123456
jq --argjson id "$id" '.[] | select(.id == $id).firstName' file.json

或者,如果您想使用以下值${data[0]}

#!/bin/bash

# other code here setting data[0] to some JSON document data.

id=123456

printf '%s\n' "${data[0]}" |
jq --argjson id "$id" '.[] | select(.id == $id).firstName'

如果查询来自用户输入或其他外部进程,则仍然使用并将文档中的值转换为字符串以与表达式中进行比较id可能更安全:--argselect()

jq --arg id "$id" '.[] | select((.id|tostring) == $id).firstName'

相关内容