基于对象属性过滤JSON数组的JOLT转换

tgabmvqs  于 2023-10-21  发布在  其他
关注(0)|答案(3)|浏览(112)

在我的Nifi教程中,我尝试使用JOLT处理器过滤和转换JSON,所以我对这方面非常陌生。
我的输入JSON是

[
  {
    "id": "1cca9371-b0f2-4c4d-9028-cd534edfecc9",
    "code": "X00615",
    "url": "https://acme.com.az/043f00e8-7db8-4cab-bc1d-5a39b0a89882"
  },
  {
    "id": "4dcacd3d-dbc8-424d-8f13-46706322a4d3",
    "code": "X01337"
  },
  {
    "id": "d5d86231-3180-4436-867b-6889ae7bd80a",
    "code": "X02732",
    "url": "https://acme.com.az/32853ca4-309c-462b-afc4-b56fd4788e8d"
  }
]

我的预期输出JSON是

[
  {
    "id": "1cca9371-b0f2-4c4d-9028-cd534edfecc9",
    "code": "X00615",
    "url": "https://acme.com.az/043f00e8-7db8-4cab-bc1d-5a39b0a89882"
  },
  {
    "id": "d5d86231-3180-4436-867b-6889ae7bd80a",
    "code": "X02732",
    "url": "https://acme.com.az/32853ca4-309c-462b-afc4-b56fd4788e8d"
  }
]

因此,我想删除缺少url条目的元素,或者换句话说,只保留以http开头的url值的元素。
我可以得到数组中的url元素,使用

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        // "id": "[&1].id", // array grows 
        // "code": "[&1].code", // array grows
        "url": {
          "htt*": {
            "$": "[].&2"
          }
        }
      }
    }
  }
]

但是当我尝试包含其他属性/值时,数组变成了4个元素而不是2个。

pkmbmrz7

pkmbmrz71#

可以将对象的键作为url属性的值

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "@": "@1,url"
      }
    }
  },
  { // get rid of the object keys
    "operation": "shift",
    "spec": {
      "*": "[]" //this square brackets are needed for the cases with the arrays 
                //having totally one url attribute throughout the whole JSON value
    }
  }
]

这样,没有url属性的对象自然消失。
网站http://jolt-demo.appspot.com/上的***演示***是:

c9x0cxw0

c9x0cxw02#

以下规范将过滤包含键url的对象,该键的值以http开头

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "@": "@1,url"
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "http*": "[]" //only url starting with http will be listed
    }
  }
]

aiazj4mn

aiazj4mn3#

我也想出了一个解决方案后,刚刚张贴,是不同的提供的答案。因此,提供它以供评论/讨论,因为它只使用一个shift操作。

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "url": {
          "": null,
          // In other case pass thru
          "*": {
            "@2": "[]"
          }
        }
      }
    }
  }
]

相关问题