用JQ展平嵌套JSON数组

用JQ展平嵌套JSON数组,json,jq,Json,Jq,我有一个JSON,格式如下: { "@version": "2.7.0", "site": { "@name": "http://api:9999", "@ssl": "false", "alerts": [ { "pluginid": "10094", "desc": "<p>Base64 encoded data was disclosed by the application/web server<

我有一个JSON,格式如下:

{
  "@version": "2.7.0",
  "site": {
    "@name": "http://api:9999",
    "@ssl": "false",
    "alerts": [
      {
        "pluginid": "10094",
        "desc": "<p>Base64 encoded data was disclosed by the application/web server<\/p>",
        "instances": [
          {
            "uri": "http://api:9999",
            "method": "POST",
            "evidence": "DxyPP_YQ6qdWA_Kw_ZLgYilIkXCz93Xs1CeJPvg"
          },
          {
            "uri": "http://api:9999",
            "method": "POST",
            "evidence": "eyJuYmYiOjE121lMWF1siSG9tZUFwcCJdfQ"
          }
        ],
        "count": "37"
      }
    ]
  }
}
通过使用以下JQ模式,我能够扁平化内部JSON数组:

.site.alerts[] as $in | $in.instances[] as $h |  $in | del(.instances) as $in2 |  $h * $in2 
这给了我一个非常接近的结果:

{
  "uri": "http://api:9999",
  "method": "POST",
  "evidence": "DxyPP_YQ6qdWA_Kw_ZLgYilIkXCz93Xs1CeJPvg",
  "pluginid": "10094",
  "desc": "<p>Base64 encoded data was disclosed by the application/web server</p>",
  "count": "37"
}
{
  "uri": "http://api:9999",
  "method": "POST",
  "evidence": "eyJuYmYiOjE121lMWF1siSG9tZUFwcCJdfQ",
  "pluginid": "10094",
  "desc": "<p>Base64 encoded data was disclosed by the application/web server</p>",
  "count": "37"
}
{
“uri”:http://api:9999",
“方法”:“发布”,
“证据”:“DxyPP_YQ6qdWA_Kw_ZLgYilIkXCz93Xs1CeJPvg”,
“pluginid”:“10094”,
“desc”:“Base64编码数据由应用程序/web服务器披露”

, “计数”:“37” } { “uri”:http://api:9999", “方法”:“发布”, “证据”:“EYJUYMYOJE121LMWF1SISG9TZUFWCCJDFQ”, “pluginid”:“10094”, “desc”:“Base64编码数据由应用程序/web服务器披露”

, “计数”:“37” }
但这不是一个完美的结果。对象不在数组中,不包括父对象中不属于数组的字段(例如
.site@name

你能帮我改进我创建的JQ模式吗


提前谢谢

这真是一个很好的努力。您的想法是正确的,您已经确保了
.instances[]
数组是平坦的,只需使用该逻辑根据需要重新构造JSON即可

jq '{ "@name" : .site."@name", 
      "@ssl"  : .site."@ssl", 
      "alerts": [.site.alerts[] as $in | $in.instances[] as $h | $in | del(.instances) as $in2 | $h * $in2 ]}' json

非常感谢您!这正是我所缺少的,我无法理解的:)
jq '{ "@name" : .site."@name", 
      "@ssl"  : .site."@ssl", 
      "alerts": [.site.alerts[] as $in | $in.instances[] as $h | $in | del(.instances) as $in2 | $h * $in2 ]}' json