我正在使用MacOS JQ工具,使用通过API返回的Shell脚本来解析JSON数组,因此我无法使用任何"quot"和/或在。<filename.json>|JQ。[]命令返回被拆分为多个项的数组,而不是"一对一";值";。如何编写JQ命令以确保返回的解析值(包括特殊字符、空格(不会被修剪或拆分为数组的新项。
示例API响应,而不是我可以编辑的本地文件
{
"location_preview":"http://somedomain.com/link_to_your_preview.png",
"location_name":"Full Back",
"location_art":"EQWEQW wqeqweqwe @#@!#!@# qweqwewqe",
"location_preview_1":"http://somedomain.com/link_to_your_preview.png"
}{
"location_preview":"http://somedomain.com/link_to_your_preview.png",
"location_name":"Full Back",
"location_art":"This is space string",
"location_preview_1":"http://somedomain.com/link_to_your_preview.png"
}{
"location_preview":"http://yrtrtytry.com/link_to_your_preview.png",
"location_name":"Full Back",
"location_art":" http://ytyrtytry.com/link_to_your_artwork.png",
"location_preview_1":"http://somedomain.com/link_to_your_preview.png"
}{
"location_preview":"http://eqweqw.com/link_to_your_preview.png",
"location_name":"Full Back",
"location_art":" http://weqweqw.com/link_to_your_artwork.png",
"location_preview_1":"http://weqweqw.com/link_to_your_preview.png"
}
当我返回元素并希望使用for循环时,键中有空格值的项将进入不同的数组项,而不是作为一个有空格的字符串。
示例:对于";location_art":"这是空格字符串"-->价值正在被分割,这是我不希望的。如何解决此问题。
我的代码片段:
newValue=$(cat response_1.json | jq '.order_items[].print_locations[].location_art')
for item in $newValue;
do
echo "New value 2: " ${item}
done
New value 2: http://weqweqw.com/link_to_your_artwork.png"
New value 2: "
New value 2: http://sdasdassd.com/link_to_your_artwork.png"
New value 2: "
New value 2: http://dasdas.com/link_to_your_artwork.png"
New value 2: "EQWEQW
New value 2: wqeqweqwe
New value 2: @#@!#!@#
New value 2: qweqwewqe"
New value 2: "EQWEQW
New value 2: wqeqweqwe
New value 2: @#@!#!@#
New value 2: qweqwewqe"
这不是jq
的问题,而是使用无引号扩展的问题(您的代码目前包含几个(。您可以将它与任何输入源一起使用。
如果要存储项目列表,请将它们存储在数组中
瞄准现代bash(4.0+(:
#!/usr/bin/env bash
case $BASH_VERSION in
''|[0123].*) echo "ERROR: bash 4.0+ required" >&2; exit 1;;
esac
mapfile -t newValue < <(
jq -r '.order_items[].print_locations[].location_art' response_1.json
)
for item in "${newValue[@]}"; do
echo "New value 2: ${item}"
done
瞄准遗留bash(包括3.2(,并利用read -a
:提供的更好的错误处理
#!/usr/bin/env bash
[ -n "$BASH_VERSION" ] || { echo "ERROR: bash required" >&2; exit 1; }
IFS=$'n' read -r -d '' -a newValue < <(
jq -r '.order_items[].print_locations[].location_art' response_1.json
&& printf ' '
) || { echo "jq failed; aborting" >&2; exit 1; }
for item in "${newValue[@]}"; do
echo "New value 2: ${item}"
done