使用jq解析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"} },

我试图使用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":"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”);完成<