使用jq解析JSON并迭代对象
我试图使用jq解析上面的json(data1.json),但是我无法访问元数据对象。我最终将使用元数据对象作为字符串插入数据库。它可以有任意数量的字段,结构不是固定的。这是我正在使用的脚本使用jq解析JSON并迭代对象,json,bash,parsing,jq,Json,Bash,Parsing,Jq,我试图使用jq解析上面的json(data1.json),但是我无法访问元数据对象。我最终将使用元数据对象作为字符串插入数据库。它可以有任意数量的字段,结构不是固定的。这是我正在使用的脚本 [ { "id":"1", "metadata":{"version":"1.0","author":"user1"} }, { "id":"2", "metadata":{"version":"1.0","author":"user2","timestamp":"2019-02-05"} },
[
{ "id":"1",
"metadata":{"version":"1.0","author":"user1"}
},
{ "id":"2",
"metadata":{"version":"1.0","author":"user2","timestamp":"2019-02-05"}
},
{ "id":"3",
"metadata":{"version":"1.0","author":"user3","price":"10.0"}
}]
我做错了什么?非常感谢您的帮助。为什么不直接用jq过滤您的数据呢
{"version":"1.0","author":"user1"}
{"version":"1.0","author":"user2","timestamp":"2019-02-05"}
{"version":"1.0","author":"user3","price":"10.0"}
请参考Shawn的回答,因为我没有考虑其他数据。为什么不直接用jq本身过滤数据呢
{"version":"1.0","author":"user1"}
{"version":"1.0","author":"user2","timestamp":"2019-02-05"}
{"version":"1.0","author":"user3","price":"10.0"}
请参考Shawn的回答,因为我没有考虑其他数据。您可以使用以下方法进行此操作:
如果上述内容位于文件foo.json
中,则可以执行以下操作:
jq -c '.[] | .metadata' data1.json
%您可以使用以下方法执行此操作:
如果上述内容位于文件foo.json
中,则可以执行以下操作:
jq -c '.[] | .metadata' data1.json
%所有元数据对象,每行一个,是否未包装在数组中
% <foo.json jtc -tc -w '<metadata>l:'
{ "author": "user1", "version": "1.0" }
{ "author": "user2", "timestamp": "2019-02-05", "version": "1.0" }
{ "author": "user3", "price": "10.0", "version": "1.0" }
但是您已经在为shell代码中的元数据数组这样做了。如果要每行打印一个阵列:
$ jq -c '.[] | .metadata' data1.json
{"version":"1.0","author":"user1"}
{"version":"1.0","author":"user2","timestamp":"2019-02-05"}
{"version":"1.0","author":"user3","price":"10.0"}
要在对象内容中有空格时将jq打印的行放入数组,请执行以下操作:
printf "%s\n" "${metadata[@]}"
mapfile-t metadata<所有元数据对象,每行一个,是否未包装在数组中
% <foo.json jtc -tc -w '<metadata>l:'
{ "author": "user1", "version": "1.0" }
{ "author": "user2", "timestamp": "2019-02-05", "version": "1.0" }
{ "author": "user3", "price": "10.0", "version": "1.0" }
但是您已经在为shell代码中的元数据数组这样做了。如果要每行打印一个阵列:
$ jq -c '.[] | .metadata' data1.json
{"version":"1.0","author":"user1"}
{"version":"1.0","author":"user2","timestamp":"2019-02-05"}
{"version":"1.0","author":"user3","price":"10.0"}
要在对象内容中有空格时将jq打印的行放入数组,请执行以下操作:
printf "%s\n" "${metadata[@]}"
mapfile-t元数据<非常感谢!这个有用!!但我看到了一个小问题,如果其中一个值中有空格,则对象不会按预期存储。例如,如果“author”:“fname lname”在所有元数据对象中都有空格,则它在fname之后中断。@prathyusha添加了一些填充数组的方法,以避免出现此问题。非常感谢!这个有用!!但我看到了一个小问题,如果其中一个值中有空格,则对象不会按预期存储。例如,如果“author”:“fname lname”在所有元数据对象中都有空格,则它在fname之后会中断。@prathyusha添加了一些填充数组的方法,以避免该问题。我不知道元数据的内容,它可以是任何内容。。所以我不能像你提到的那样设置字段。我不知道元数据的内容,它可以是任何内容。。所以我不能像你提到的那样设置字段。最好使用-r
选项来确保散步的单行输出。因此,完整的答案是:而IFS=read-r obj;do元数据+=(“$obj”);完成<最好使用-r
选项来确保步行时的单行输出。因此,完整的答案是:而IFS=read-r obj;do元数据+=(“$obj”);完成<