JQ使用shell获取JSON数组,但不返回一个带有空格的值项



我正在使用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

最新更新