简体   繁体   English

Dataweave中Json数组的转换

[英]Transformation of Json array in Dataweave

How to write Dataweave transformation in Anytime Studio for given input and output of Json array.如何在 Anytime Studio 中为给定的 Json 数组输入和输出编写 Dataweave 转换。 Input:输入:

{
    "result": [{
        "Labels": [{
            "value": [{
                    "fieldName": "firstName",
                    "value": "John"
                },
                {
                    "fieldName": "lastName",
                    "value": "Doe"
                },
                {
                    "fieldName": "fullName",
                    "value": "John Doe"
                }
            ]
        }]
    }]
}

Output:输出:

 {
    "result": [{
        "Labels": [{
            "value": [{
                "firstName": "John",
                "lastName": "Doe",
                "fullName": "John Doe"
            }]
        }]
    }]
 }

https://docs.mulesoft.com/dataweave/2.4/dw-core-functions-reduce Reduce function might be the one should be used Thank you in advance https://docs.mulesoft.com/dataweave/2.4/dw-core-functions-reduce Reduce 函数可能是应该使用的函数提前谢谢你

You can just use map to map all the arrays to required format.您可以使用map将所有数组映射到所需的格式。 For the value part you can map the values as fieldName: value array and deconstruct them to an object by wrapping the array around parentheses对于值部分,您可以将值映射为fieldName: value数组并通过将数组包裹在括号中将它们解构为对象

%dw 2.0
output application/json  
---
{
  result: payload.result map ((item) -> {
    Labels: item.Labels map ((label) -> {
      value: [
        {
          (label.value map ((field) -> 
            (field.fieldName): field.value
          )) //wrap the array, i.e. lavel.value map ... in parentheses so that it will give you individual key pair.
        }
      ]
    })
  })
}

You can try below if you are aware that the keyNames will not change:如果您知道 keyNames 不会改变,您可以在下面尝试:

%dw 2.0
output application/json  
---
payload update {
  case res at .result -> res map (res, resIndex) -> (res update {
      case lbl at .Labels -> lbl map (lbl, lblIndex) -> (lbl update {
          case val at .value -> [
            (val reduce ((item, acc = {}) -> acc ++ {
                (item.fieldName): (item.value)
              }))
          ]
        }
        )
    }
    )
}

Here's 2 caveats and a solution.这是2个警告和一个解决方案。 Your input and output files, both are not valid JSON.您的输入和输出文件都不是有效的 JSON。

  1. Input file, in your "result" object, "Labels" need curly braces {} since they are objects.输入文件,在您的“结果”对象中,“标签”需要花括号 {},因为它们是对象。 Key-value pairs should look like this {key:value} not like that key:value键值对应该看起来像这样 {key:value} 而不是那个 key:value
  2. Output file, inside your "value" arrays, key-value pairs need to have the curlies {key:value}输出文件,在你的“值”数组中,键值对需要有 curlies {key:value}

So here's a valid JSON version of your input所以这是您输入的有效 JSON 版本

{
 "result": [
  {"Labels": [
        {
          "value": [
            {"fieldName": "firstName","value": "John"},
            {"fieldName": "lastName","value": "Doe"},
            {"fieldName": "fullName","value": "John Doe"}
          ]
        }
      ]},
   {"Labels": [
        {
          "value": [
            {"fieldName": "firstName","value": "John"}
          ]
        }
      ]}
]}  

Here's a solution这是一个解决方案

%dw 2.0
import keySet from dw::core::Objects

// this is "result"
var layer1key = keySet(payload)[0]
// this is "Labels" and grabs the first Labels, so assumes Labels doesn't change
var layer2 = payload[layer1key]
var layer2key = keySet(layer2[0])[0]
// this is "value"
var layer3 = layer2[layer2key]
var layer3key = keySet(layer3[0][0])[0]
// this is "fieldName" and "value"
var layer4 = layer3 map (x) -> x['value']

var data1 = ((layer1key) : layer4 map (x) -> {
    (layer2key): x map (y) -> {
        (layer3key): y map (z) -> {
            (z['fieldName']):z['value']
        }
    }
})
output application/json
---
data1

And a valid JSON version of your output以及输出的有效 JSON 版本

{
  "result": [
    {
      "Labels": [
        {
          "value": [
            {
              "firstName": "John"
            },
            {
              "lastName": "Doe"
            },
            {
              "fullName": "John Doe"
            }
          ]
        }
      ]
    },
    {
      "Labels": [
        {
          "value": [
            {
              "firstName": "John"
            }
          ]
        }
      ]
    }
  ]
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM