在dataweave 2中使用运算符进行过滤的示例

如何解决在dataweave 2中使用运算符进行过滤的示例

我正在使用dataweave 2进行转换。我需要使用过滤器运算符来过滤有效载荷,具体取决于请求正文中的值。使用“使用”的原因是因为该值是可选的,在这种情况下,我不想过滤有效负载。我的转型-

%dw 2.0
output application/json skipNullOn="everywhere"
fun toDate(v) = (v as String{format:'yyyy-MM-dd'} as Date) default null
---
    
if (payload is Array)
    flatten (
        payload **//need to put 2 filters here on  $.CloudAccountDetail.status and $.CloudAccountDetail.clouAccountId //**  map (item,order) -> (
            flatten ( [
                item.NamedSubscriptions map {
                    key: $.SubscriptionId,expiryDate: toDate($.ExpiryDate)
                    //nextPaymentDate: toDate($.NextPaymentDueDate)
                },item.UnnamedSubscriptions map {
                    key: $.SubscriptionId,expiryDate: toDate($.ExpiryDate),cloudPublicName: item.CloudAccountDetail.CloudAccountPublicName,cloudAccountId: $.EskoCloudAccount
                }
            ] )
        )  
    )
else []

输入-

[
  {
    "CloudAccountDetail": {
      "CompanyCode": "B_B001","CloudAccountId": "a-t-1000-5001-0687-0024","CloudAccountPublicName": "dodp-testcloud","Status": "SUBSCRIBED","ClusterName": "ci.dev.cloudi.city"
    },"NamedSubscriptions": [
      {
        "SubscriptionId": "8f724cc9-bb21-43bc-8911-94d267eb7917","OrderNumber": "TEST708259","StartDate": "2020-01-07T12:13:19.507","ExpiryDate": "2021-01-16T00:00:00","CanceledDate": null,"ProductCode": "ECL-SA-PUSR","ProductName": "Esko Cloud Power User","Assignee": "eskododp03@yahoo.be","AssignedBy": "LicenseService","AssignedDate": "2020-01-07T11:16:52.723","EskoCloudAccount": "a-t-1000-5001-0687-0024","Status": "ACTIVE"
      },{
        "SubscriptionId": "5c06112a-90a4-4e76-b2f4-bd19a1ce92b3","Assignee": null,"AssignedBy": null,"AssignedDate": null,{
        "SubscriptionId": "a258a7fc-cff6-4b53-b19d-4e25a8dbcee6",{
        "SubscriptionId": "e30f16af-de60-4b84-bdae-aa7b6523c316",{
        "SubscriptionId": "5ee9eeb6-9d65-42b8-b594-68c9528ff25b","StartDate": "2020-01-07T12:13:20.507",{
        "SubscriptionId": "818b38f1-0a10-45dc-ae16-f7d804b31cbc",{
        "SubscriptionId": "cf5fc421-8ee0-4f1f-a1ca-e64daef2e0c6","Status": "ACTIVE"
      }
    ],"UnnamedSubscriptions": [
      {
        "SubscriptionId": "c56c5d21-83dd-4df5-851c-52fd5686240b","StartDate": "2020-01-07T13:23:02.593","ProductCode": "ECL-SA-SITE","ProductName": "Share & Approve Site",{
        "SubscriptionId": "1d5bf54c-e812-4c17-830d-d3a1104d66a5",{
        "SubscriptionId": "fbe0bbef-3cc2-451a-9866-0bb31a829850",{
        "SubscriptionId": "368fa144-5a94-4ead-ba69-502ca6419de4",{
        "SubscriptionId": "3404fb6e-d234-4dac-a5a1-96c7534ccf21","StartDate": "2020-01-07T13:23:03.593",{
        "SubscriptionId": "71d88ad6-3108-499e-8be9-3638c7298770",{
        "SubscriptionId": "992b551e-1499-4971-bc9b-34075820faa7","StorageSubscriptions": [
      {
        "EntitlementId": "5ceae026-5c3e-40df-a9f8-2de4f4570566","StorageInGb": 50,"ExpiryDate": "2021-01-07T00:00:00","StartDate": "2020-01-07T12:37:12.697","ProductCode": "ECL-ECL-ST-ST50","ProductName": "Storage Tier 1 (50GB)","TransactionSubscriptions": [
      {
        "EntitlementId": "6eaf4b93-8fef-4423-88fd-7e83d790f6f7","NumberOfTransactions": 12000,"StartDate": "2020-01-07T12:17:56.257","ProductCode": "ECL-ECL-BTR-BTR1000","ProductName": "Basic Transactions Tier 2 (1000/m)","Status": "ACTIVE"
      }
    ]
  },{
    "CloudAccountDetail": {
      "CompanyCode": "B_B001","CloudAccountId": "a-t-1001-0001-0039-0024","CloudAccountPublicName": "Test-Tom-Desmet","Status": "TRIAL","NamedSubscriptions": [
      {
        "SubscriptionId": "3dc289af-d469-4dba-875e-354c75d2a31a","OrderNumber": "TEST709894","StartDate": "2020-06-30T14:21:34.773","ExpiryDate": "2021-07-09T00:00:00","AssignedDate": "2020-06-30T13:31:01.777","EskoCloudAccount": "a-t-1001-0001-0039-0024",{
        "SubscriptionId": "3e6818fb-1c4f-4046-9783-5b76d3050eec","StartDate": "2020-06-30T14:21:35.773","UnnamedSubscriptions": [
      {
        "SubscriptionId": "baf3d5c7-b53e-460e-93a5-311b95924fca","StartDate": "2020-06-30T15:18:15.593",{
        "SubscriptionId": "69071fd1-59b5-44ef-a594-95141d68ef4c","StartDate": "2020-06-30T15:18:16.593","StorageSubscriptions": [
      {
        "EntitlementId": "f6f444e3-4dea-43d9-afc0-19d24200cf46","ExpiryDate": "2021-06-30T00:00:00","StartDate": "2020-06-30T14:57:54.05","TransactionSubscriptions": [
      {
        "EntitlementId": "22d25390-4183-4c89-8461-38ebf048812f","StartDate": "2020-06-30T14:24:10.017","Status": "ACTIVE"
      }
    ]
  }
]

转换后我需要的输出。请注意,我没有考虑在输出中进行过滤。 -

[
  {
    "key": "8f724cc9-bb21-43bc-8911-94d267eb7917","expiryDate": "2021-01-16"
  },{
    "key": "5c06112a-90a4-4e76-b2f4-bd19a1ce92b3",{
    "key": "a258a7fc-cff6-4b53-b19d-4e25a8dbcee6",{
    "key": "e30f16af-de60-4b84-bdae-aa7b6523c316",{
    "key": "5ee9eeb6-9d65-42b8-b594-68c9528ff25b",{
    "key": "818b38f1-0a10-45dc-ae16-f7d804b31cbc",{
    "key": "cf5fc421-8ee0-4f1f-a1ca-e64daef2e0c6",{
    "key": "c56c5d21-83dd-4df5-851c-52fd5686240b","expiryDate": "2021-01-16","cloudPublicName": "dodp-testcloud","cloudAccountId": "a-t-1000-5001-0687-0024"
  },{
    "key": "1d5bf54c-e812-4c17-830d-d3a1104d66a5",{
    "key": "fbe0bbef-3cc2-451a-9866-0bb31a829850",{
    "key": "368fa144-5a94-4ead-ba69-502ca6419de4",{
    "key": "3404fb6e-d234-4dac-a5a1-96c7534ccf21",{
    "key": "71d88ad6-3108-499e-8be9-3638c7298770",{
    "key": "992b551e-1499-4971-bc9b-34075820faa7",{
    "key": "3dc289af-d469-4dba-875e-354c75d2a31a","expiryDate": "2021-07-09"
  },{
    "key": "3e6818fb-1c4f-4046-9783-5b76d3050eec",{
    "key": "baf3d5c7-b53e-460e-93a5-311b95924fca","expiryDate": "2021-07-09","cloudPublicName": "Test-Tom-Desmet","cloudAccountId": "a-t-1001-0001-0039-0024"
  },{
    "key": "69071fd1-59b5-44ef-a594-95141d68ef4c","cloudAccountId": "a-t-1001-0001-0039-0024"
  }
]

解决方法

您应该首先将过滤器应用于整个数组,然后执行其余的转换:

%dw 2.0
output application/json skipNullOn="everywhere"
fun toDate(v) = (v as String{format:'yyyy-MM-dd'} as Date) default null
var status = 'SUBSCRIBED'
var accountId = 'a-t-1000-5001-0687-0024'
---
if (payload is Array)
  flatten(payload filter ($.CloudAccountDetail.CloudAccountId == accountId and $.CloudAccountDetail.Status == status) map(item,value) -> 
flatten ( [
                item.NamedSubscriptions map {
                    key: $.SubscriptionId,expiryDate: toDate($.ExpiryDate)
                    //nextPaymentDate: toDate($.NextPaymentDueDate)
                },item.UnnamedSubscriptions map {
                    key: $.SubscriptionId,expiryDate: toDate($.ExpiryDate),cloudPublicName: item.CloudAccountDetail.CloudAccountPublicName,cloudAccountId: $.EskoCloudAccount
                }
            ] ))
else []

上面的dataweave表达式应用于以下提供的输入结果:

[
  {
    "key": "8f724cc9-bb21-43bc-8911-94d267eb7917","expiryDate": "2021-01-16"
  },{
    "key": "5c06112a-90a4-4e76-b2f4-bd19a1ce92b3",{
    "key": "a258a7fc-cff6-4b53-b19d-4e25a8dbcee6",{
    "key": "e30f16af-de60-4b84-bdae-aa7b6523c316",{
    "key": "5ee9eeb6-9d65-42b8-b594-68c9528ff25b",{
    "key": "818b38f1-0a10-45dc-ae16-f7d804b31cbc",{
    "key": "cf5fc421-8ee0-4f1f-a1ca-e64daef2e0c6",{
    "key": "c56c5d21-83dd-4df5-851c-52fd5686240b","expiryDate": "2021-01-16","cloudPublicName": "dodp-testcloud","cloudAccountId": "a-t-1000-5001-0687-0024"
  },{
    "key": "1d5bf54c-e812-4c17-830d-d3a1104d66a5",{
    "key": "fbe0bbef-3cc2-451a-9866-0bb31a829850",{
    "key": "368fa144-5a94-4ead-ba69-502ca6419de4",{
    "key": "3404fb6e-d234-4dac-a5a1-96c7534ccf21",{
    "key": "71d88ad6-3108-499e-8be9-3638c7298770",{
    "key": "992b551e-1499-4971-bc9b-34075820faa7","cloudAccountId": "a-t-1000-5001-0687-0024"
  }
]
,

更干净的例子。代替使用展平,尝试使用function来填充值。

示例:

%dw 2.0
var accountStatus=["SUBSCRIBED"]
var accountId=["a-t-1000-5001-0687-0024"]
fun getData(items,account,isUnnamedSubscriptions) = 
    (items default []) map {
        "key": $.SubscriptionId,"expiryDate": $.ExpiryDate as Date,("cloudPublicName": account.CloudAccountPublicName) if (isUnnamedSubscriptions),("cloudAccountId": account.CloudAccountId) if (isUnnamedSubscriptions)
    }

output application/json
---

(payload[?((accountId contains $.CloudAccountDetail.CloudAccountId) 
    and (accountStatus contains $.CloudAccountDetail.Status) )] map (
        getData($.NamedSubscriptions,$.CloudAccountDetail,false)
        ++
       getData($.UnnamedSubscriptions,true)
) flatMap () -> $) default []

accountId变量是一个数组,您也可以将其替换为字符串,类似于第status行和第2行中的3

如果要过滤多个accountId,只需在accountId中添加另一个与status相同的字符串即可。

如果您要在CloudAccountDetail.Status为Null和CloudAccountDetail.CloudAccountId为Null时排除过滤器,则

您可以创建一个返回布尔值的函数。功能应该是这样的

fun isValidFilter(id,stat) = 
    if ( id !=null and stat != null) 
       ((accountId contains id) and (accountStatus contains stat))
    else (true)

并将值传递给函数isValidFilter

示例:

payload[?( (isValidFilter($.CloudAccountDetail.CloudAccountId,$.CloudAccountDetail.Status)) )] map ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-