繁体   English   中英

DataWeave JSON 转换/提取和连接值

[英]DataWeave JSON Transformation/ Extract and concatenate values

我正在从 JSON 结构中寻找 go,它看起来像这样:

{
  "id": "955559665",
  "timestamp": "2022-04-21 00:00:19",
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15",
  "remote_addr": "123.456.789.012",
  "read": "0",
  "data": {
      "80928111": {
          "field": "80928111",
          "value": "Z01234567",
          "flat_value": "Z01234567",
          "label": "ID",
          "type": "text"
      },
      "90924321": {
          "field": "90924321",
            "value": {
                "first": "Jane",
                "last": "Doe"
            },
            "flat_value": "first = Jane\nlast = Doe",
            "label": "Name",
            "type": "name"
        },
        "88888770": {
            "field": "88888770",
            "value": "jdoe001@gmail.com",
            "flat_value": "jdoe001@gmail.com",
            "label": "Email",
            "type": "email"
        },
        "12345678": {
            "field": "12345678",
            "value": "https://www.google.com/subdomain/attachment/file.txt",
            "flat_value": "https://www.google.com/subdomain/attachment/file.txt",
            "label": "Choose File",
            "type": "file"
        }
    }
}

最终是这样的:

{
    "name_val":"Name: first = Jane\nlast = Doe\nEmail: jdoe001@gmail.com\n",
    "file": {
      "id": "12345678C",
      "name": "file.txt"
    }
}

在原来的JSON中,'数据'object代表一个表单提交。 每个子 object 代表提交表单上的一个字段。 我感兴趣的唯一区别是标识为“文件”的字段的“类型”。

每个不是“文件”类型的响应,我都想连接成一个大的字符串值,如下所示:“label1: flat_value1\nlabel2: flat_value2 ...”

请注意,实际字段的数量是可变的。

然后,我需要第二个 object 来显示“文件”类型的字段,方法是识别“字段”ID 和文件名。

我已经开始工作了。 例如,使用 pluck 和 filter,我已经能够分离字段的类型。

是这样的:

%dw 2.0
output application/json
---
[
    "fields": payload.data pluck(
        {
            "field": $."label",
            "value": $."flat_value",
            "type": $."type"
        }
    ) filter ($."type" != "file") default "",
    "files": payload.data pluck(
        {
            "type": $."type",
            "fieldId": $."field"
        }
    ) filter ($."type" == "file") default ""
]

给我:

[
  {
    "fields": [
      {
        "field": "ID",
        "value": "Z01234567",
        "type": "text"
      },
      {
        "field": "Name",
        "value": "first = Jane\nlast = Doe",
        "type": "name"
      },
      {
        "field": "Email",
        "value": "jdoe001@gmail.com",
        "type": "email"
      }
    ]
  },
  {
    "files": [
      {
        "type": "file",
        "fieldId": "12345678"
      }
    ]
  }
]

玩弄修改后的 JSON 输入,我能够轻松地看到与我希望看到的类似的连接,但不完全是:

%dw 2.0
output application/json
var inputJson = [
    {
        "field": "ID",
        "value": "Z01234567",
        "type": "text"
    },
    {
        "field": "Name",
        "value": "first = Jane\nlast = Doe",
        "type": "name"
    }
]
---


inputJson map ((value, index) -> value.field ++ ': ' ++ value.value)

给我:

[
  "ID: Z01234567",
  "Name: first = Jane\nlast = Doe"
]

但我似乎无法将所有内容和 go 从头到尾放在一起。

有几种方法可以实现这一点。 我建议尝试封装您开始工作的部分并将它们用作构建块。

%dw 2.0
output application/json
fun fields(x) = x.data pluck(
        {
            "field": $."label",
            "value": $."flat_value",
            "type": $."type"
        }
    ) filter ($."type" != "file") default ""
fun files(x) = x.data pluck(
        {
            "type": $."type",
            "fieldId": $."field"
        }
    ) filter ($."type" == "file") default ""
---
{
    name_val: fields(payload) reduce ((item,acc="") -> acc ++ item.field ++ ': ' ++ item.value ++ "\n"),
    files: files(payload)[0]
}

Output:

{
  "name_val": "ID: Z01234567\nName: first = Jane\nlast = Doe\nEmail: jdoe001@gmail.com\n",
  "files": {
    "type": "file",
    "fieldId": "12345678"
  }
}

暂无
暂无

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

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