JSON-массив в строку, используя mule dataweave - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть следующие требования.

Ввод

{ "packageConfiguration": [
      {
        "packageId": [
          "AIM_PACKAGE"
        ],
        "component": [
          "Handbook"
        ],
        "fieldName": [
          "Upload Handbook Document"
        ],
        "assetUrl": [
          "sflydamlocation.handbookfilename.pdf"
        ]
      }
    ]}

Мне нужно преобразовать вышеуказанный массив json в этот формат вывода:

 {
        "pakage": ""packageId":"AIM_PACKAGE", "component":"Handbook",  "fieldName":"Upload Handbook Document","assetUrl":"sflydamlocation.handbookfilename.pdf""
}

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Вы можете сделать это, рассматривая все поля как строки, однако учтите, что:

  1. Внутренние кавычки должны быть экранированы. В противном случае вывод не является допустимым JSON.
  2. Примите во внимание, что значение "package" также не является действительным JSON, если вы хотите его проанализировать. Это должен объект (например, "{\" package \ ": ...}")
  3. Этот скрипт ожидает, что все массивы имеют ровно 1 элемент. Больше элементов игнорируется, и меньшее может привести к ошибке. Это не очень надежная конструкция.

Сценарий (не рекомендуется):

%dw 2.0
output application/json

---
package: using (pc = payload.packageConfiguration[0]) (

        " \"packageId\": \"$(pc.packageId[0])\", " ++  
        " \"component\": \"$(pc.component[0])\" "  ++
        " \"fieldName\": \"$(pc.fieldName[0])\" "  ++
        " \"assetUrl\": \"$(pc.assetUrl[0])\" "
 )

Выход:

{
  "package": " \"packageId\": \"AIM_PACKAGE\",  \"component\": \"Handbook\"  \"fieldName\": \"Upload Handbook Document\"  \"assetUrl\": \"sflydamlocation.handbookfilename.pdf\" "
}

Это уродливая конкатенация строк. Вместо этого я бы предложил написать желаемый вывод в виде объекта JSON.

Сценарий (рекомендуется):

%dw 2.0
output application/dw
var pc = payload.packageConfiguration[0]
---
package: 
    write({
        packageId: pc.packageId[0],  
        component: pc.component[0],  
        fieldName: pc.fieldName[0],  
        assetUrl: pc.assetUrl[0]
        }, "application/json") replace /\n/ with ""

выход

{
  "package": "{  \"packageId\": \"AIM_PACKAGE\",  \"component\": \"Handbook\",  \"fieldName\": \"Upload Handbook Document\",  \"assetUrl\": \"sflydamlocation.handbookfilename.pdf\"}"
}

Второй сценарий намного чище, менее подвержен ошибкам и возвращает экранированный объект JSON, который вы можете удалить, чтобы использовать в качестве JSON.

0 голосов
/ 03 ноября 2018

Нечто подобное должно работать, если вам не требуется что-то более гибкое. Я предполагаю, что вы работаете с Mule3 / DW1:

%dw 1.0
%output application/json

%var packageConfig = payload.packageConfiguration[0]
---
{
  package: packageConfig mapObject ((value, key) -> {
    (key): value[0]
  })
}
...