Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays JQ使用shell获取JSON数组不在一个项目中返回带空格的值_Arrays_Json_Bash_Shell_Jq - Fatal编程技术网

Arrays JQ使用shell获取JSON数组不在一个项目中返回带空格的值

Arrays JQ使用shell获取JSON数组不在一个项目中返回带空格的值,arrays,json,bash,shell,jq,Arrays,Json,Bash,Shell,Jq,我正在使用MacOS JQ工具,使用通过API重新调整的Shell脚本解析JSON数组,因此我无法使用“”和\或中的任何键修改JSON值。|JQ.[]命令返回拆分为多个项的数组,而不是一对一的“值”。如何编写JQ命令以确保返回的解析值(包括特殊字符、空格)不会被修剪或拆分为数组的新项 示例API响应,而不是我可以编辑的本地文件。 { “位置预览”:http://somedomain.com/link_to_your_preview.png", “位置名称”:“后卫”, “地点艺术”:“Eqweq

我正在使用MacOS JQ工具,使用通过API重新调整的Shell脚本解析JSON数组,因此我无法使用“”和\或中的任何键修改JSON值。|JQ.[]命令返回拆分为多个项的数组,而不是一对一的“值”。如何编写JQ命令以确保返回的解析值(包括特殊字符、空格)不会被修剪或拆分为数组的新项

示例API响应,而不是我可以编辑的本地文件。

{
“位置预览”:http://somedomain.com/link_to_your_preview.png",
“位置名称”:“后卫”,
“地点艺术”:“Eqweqwqweqwe!#!#qweqwe”,
“位置\u预览\u 1”:http://somedomain.com/link_to_your_preview.png"
}{
“位置预览”:http://somedomain.com/link_to_your_preview.png",
“位置名称”:“后卫”,
“位置艺术”:“这是空间字符串”,
“位置\u预览\u 1”:http://somedomain.com/link_to_your_preview.png"
}{
“位置预览”:http://yrtrtytry.com/link_to_your_preview.png",
“位置名称”:“后卫”,
“地点艺术”:http://ytyrtytry.com/link_to_your_artwork.png",
“位置\u预览\u 1”:http://somedomain.com/link_to_your_preview.png"
}{
“位置预览”:http://eqweqw.com/link_to_your_preview.png",
“位置名称”:“后卫”,
“地点艺术”:http://weqweqw.com/link_to_your_artwork.png",
“位置\u预览\u 1”:http://weqweqw.com/link_to_your_preview.png"
}
当我返回元素并希望使用for循环时,键中带有空格值的项将进入不同的数组项,而不是作为带有空格的字符串

示例:对于“location_art”:“This is space string”-->该值被拆分,这是我不想要的。如何解决这个问题

我的代码片段:

newValue=$(cat响应_1.json | jq'.订购_项目[]。打印_位置[]。位置_艺术')
对于$newValue中的项目;
做
echo“新值2:${item}
完成
新值2:http://weqweqw.com/link_to_your_artwork.png"
新值2:“
新值2:http://sdasdassd.com/link_to_your_artwork.png"
新值2:“
新值2:http://dasdas.com/link_to_your_artwork.png"
新值2:“EQWEQW
新值2:wqweqwe
新值2:@#@!#@#
新值2:QWEQWEQE“
新值2:“EQWEQW
新值2:wqweqwe
新值2:@#@!#@#
新值2:QWEQWEQE“

这不是jq的问题,而是使用无引号的扩展(您的代码当前包含几个扩展)的问题。任何输入源都会有它

如果要存储项目列表,请将其存储在数组中。 针对现代bash(4.0+):


请考虑使用三重后退栅栏来启动和结束代码格式化部分——与旧的四空间方法不同,这可以让您知道使用哪种语法高亮显示用于每一节。除此之外,<$> /<代码>中的条目<代码>总是不好的做法。嗨,查尔斯,谢谢您的回复,您能帮助共享读数组吗?类似的回答是,我的机器不会上网,而且不是所有的开发人员都有Bash4.0,那就太好了help@VickyDhas,我编辑了这两种方法的完整示例。如果有一个Curl响应json返回,如“projectResponse=$(Curl-u“$username:$password”),您就节省了我的时间,这只是最后一个查询,因为我不是win Shell的专家-我首先要做的是将响应存储在json文件中,以便记录,因此上面的记录现在正在工作,如何将响应直接传递给上面的IFS代码,而不是文件。
#!/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
#!/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 '\0'
) || { echo "jq failed; aborting" >&2; exit 1; }

for item in "${newValue[@]}"; do
    echo "New value 2: ${item}"
done