Массив JSON в строку с использованием mule dataweave

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

Вход

{ "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""
}

person Karthik Raja J    schedule 02.11.2018    source источник


Ответы (2)


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

  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.

person aled    schedule 03.11.2018
comment
но внутри конфигурации пакета будет больше этих полей ... иногда будут добавлены новые поля - person Karthik Raja J; 04.11.2018
comment
любые способы заменить этот специальный символ, например \ n \ {} на nospace - person Karthik Raja J; 04.11.2018
comment
Это новые строки, которые помогают сделать JSON красивым, но их можно удалить с помощью функции replace (). Я отредактировал пример, чтобы удалить их. Вы имеете в виду, что хотите выполнить итерацию по любым полям с одним и тем же шаблоном? Об этом не упоминалось в исходном вопросе. На самом деле ответ Джерни, кажется, делает это. - person aled; 05.11.2018
comment
на самом деле я бы хотел удалить \ и {}, чтобы он был идеальным - person Karthik Raja J; 05.11.2018
comment
в любом случае заменить \ in \ packageId \ на packageId - person Karthik Raja J; 05.11.2018
comment
снятие экранирования кавычек внутри строкового значения не будет допустимым JSON. Я категорически не рекомендую. Если вы все еще хотите это сделать, вы можете использовать функцию replace () и вместо этого вернуть строку Java. - person aled; 05.11.2018

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

%dw 1.0
%output application/json

%var packageConfig = payload.packageConfiguration[0]
---
{
  package: packageConfig mapObject ((value, key) -> {
    (key): value[0]
  })
}
person jerney    schedule 03.11.2018
comment
но внутри конфигурации пакета могут быть добавлены новые поля, так что есть ли способ выровнять его - person Karthik Raja J; 04.11.2018
comment
Обязательно доработаю свой ответ - person jerney; 04.11.2018
comment
package: {packageId: AIM_PACKAGE, component: Handbook, fieldName: Загрузить документ справочника, assetUrl: sflydamlocation.handbookfilename.pdf} просто нужно удалить их {и} все будет хорошо - person Karthik Raja J; 05.11.2018
comment
Вероятно, вы можете использовать какую-то комбинацию этого ответа и ответа выше. Удачи! - person jerney; 05.11.2018