在 Dataweave 2.0 中将属性从属性文件转换为 json

问题描述

如何从属性文件转换属性

creditmaster.metadata.AverageFicoScore=700
creditmaster.a.b.c=xyz

以通用的方式转换成这个json格式

{
  creditmasterMetaData: [
     {
       attributeKey: "AverageFicoScore",attributeValue: 700
     }
  ]
}

解决方法

这个脚本是通用的,因为键的部分是什么并不重要,它只按第一个元素(第一个点之前)和最后一个点之后的键名进行分组,它忽略了中:

%dw 2.3
output application/java
import * from dw::core::Strings

fun mapProperties(props) = 
    entriesOf(props) // since Mule 4.3 / DW 2.3
        filter (substringAfter($.key,".") startsWith "metadata.") // to filter keys with .metadata.
        groupBy ((item,index) -> substringBefore(item.key,".")) 
        mapObject ((value,key,index) ->  
            (key): value map {
                attributeKey: substringAfterLast($.key,"."),attributeValue: if (isInteger($.value)) $.value as Number else $.value
            }
        )
---
mapProperties(payload)

输入文件:

creditmaster.metadata.AverageFicoScore= 700
other.a.b= 123
creditmaster.a.b.c=xyz
something.metadata.another.maximum=456
creditmaster.metadata.different.minimum=500

输出(为清晰起见,采用 JSON):

{
  "something": [
    {
      "attributeKey": "maximum","attributeValue": "456"
    }
  ],"creditmaster": [
    {
      "attributeKey": "minimum","attributeValue": "500"
    },{
      "attributeKey": "AverageFicoScore","attributeValue": "700"
    }
  ]
}
,

另一种方法是使用 pluck 函数。它允许您迭代接收条目的对象。

如果你有这个输入

{
  "creditmaster": {
    "metadata": {
      "AverageFicoScore": "700","OtherData": "Some value"
    }
  }
}

有了这个转变

{
  creditmasterMetaData:
    payload.creditmaster.metadata pluck ((value,index) -> 
      {
        attributeKey: key,attributeValue: value
      }
    )
}

你得到这个输出

{
  "creditmasterMetaData": [
    {
      "attributeKey": "AverageFicoScore","attributeValue": "700"
    },{
      "attributeKey": "OtherData","attributeValue": "Some value"
    }
  ]
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...