Mule 4: преобразовать вложенный JSON и загрузить в базу данных (сгладить)

Мне нужно преобразовать ниже вложенный JSON в плоский и загрузить в базу данных.

Вложенный JSON в Flatten

Ввод JSON:

{
"Report_Entry": [
{
   "ContractNumber": "1111111",
   "Company": "ABCD INC."
   "Contract_Lines_group": [
      {
         "LineShipToCustomer": "GOOD INC.",
         "LineReferenceId": "123456789_EXP"
      },
      {
         "LineShipToCustomer": "XYZ TELECOM",
         "LineReferenceId": "123456789_TIME"
      }
   ],
   "ContractName": "TEST Contract",
   "ReferenceId": "123456789"
},
{
   "ContractNumber": "222222",
   "Company": "FASLSE NEWS INC."
   "Contract_Lines_group": [
      {
         "LineShipToCustomer": "LIVE NEWS INC.",
         "LineReferenceId": "789999_EXP"
      },
      {
         "LineShipToCustomer": "SKY NEWS INC.",
         "LineReferenceId": "789999_TIME"
      }
   ],
   "ContractName": "FALSE NEWS Contract",
   "ReferenceId": "6789999"
}
]
}

Ожидаемый текстовый вывод:

ContractNumber|Company|LineShipToCustomer|LineReferenceId|ContractName|ReferenceId

\-- Set 1

1111111|ABCD INC|GOOD INC|123456789_EXP|TEST Contract|123456789
1111111|ABCD INC|XYZ TELECOM|123456789_TIME|TEST Contract|123456789

\-- Set 2

222222|FASLSE NEWS INC.|LIVE NEWS INC.|789999_EXP|FALSE NEWS Contract|6789999
222222|FASLSE NEWS INC.|SKY NEWS INC.|789999_TIME|FALSE NEWS Contract|6789999

Выход (JSON):

[
{
   "ContractNumber": "1111111",
   "Company": "ABCD INC."
   "Contract_Lines_group": [
      {
         "LineShipToCustomer": "GOOD INC.",
         "LineReferenceId": "123456789_EXP"
      }
   ],
   "ContractName": "TEST Contract",
   "ReferenceId": "123456789"
}, 
{
   "ContractNumber": "1111111",
   "Company": "ABCD INC."
   "Contract_Lines_group": [
      {
         "LineShipToCustomer": "XYZ TELECOM",
         "LineReferenceId": "123456789_TIME"
      }
   ],
   "ContractName": "TEST Contract",
   "ReferenceId": "123456789"
   } ,
{
   "ContractNumber": "222222",
   "Company": "FASLSE NEWS INC."
   "Contract_Lines_group": [
      {
         "LineShipToCustomer": "LIVE NEWS INC.",
         "LineReferenceId": "789999_EXP"
      }
   ],
   "ContractName": "FALSE NEWS Contract",
   "ReferenceId": "123456789",
},
{
   "ContractNumber": "222222",
   "Company": "FASLSE NEWS INC."
   "Contract_Lines_group": [
      {
         "LineShipToCustomer": "SKY NEWS INC.",
         "LineReferenceId": "789999_TIME"
      }
   ],
   "ContractName": "FALSE NEWS Contract",
   "ReferenceId": "6789999",
}   
]

Привет @махари. Когда вы говорите «сгладить», вы имеете в виду текст «плоский файл»? Оба термина имеют разное и специфическое значение в DataWeave. flatten() — это функция, которая используется для создания простого массива из вложенных массивов и не имеет никакого отношения к вашему вопросу. Плоские файлы представляют собой текстовые файлы фиксированной длины, которые, похоже, не являются вашим выводом. Что такое вывод JSON, если ожидаемый вывод «текст»? Также объясните сопоставление входного JSON с текстовым выводом. Вопрос в том, как сгенерировать ожидаемый результат или как на самом деле загрузить в базу данных?

aled 27.12.2022 13:30

А что такое "Набор 1" и "Набор 2" на выходе?

aled 27.12.2022 13:39

Обратите внимание, что введенный вами JSON недействителен, поскольку в нем отсутствуют запятые в ключе Company.

aled 27.12.2022 13:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что вам нужно преобразовать входной JSON в выходной CSV, используя символ вертикальной черты | в качестве разделителя. Вам необходимо сопоставить каждый из внутренних элементов строки с записью.

Вы можете использовать функцию flatten(), однако Mule 4 имеет более удобную функцию для одновременного сопоставления и сглаживания: flatMap().

Пример:

%dw 2.0
output application/csv separator = "|"
---
payload.Report_Entry flatMap ((item, order) -> 
    item.Contract_Lines_group map ((line, lineOrder) -> {
        ContractNumber: item.ContractNumber,
        Company: item.Company,
        LineShipToCustomer: line.LineShipToCustomer,
        LineReferenceId: line.LineReferenceId,
        ContractName: item.ContractName,
        ReferenceId: item.ReferenceId
    })
)

Выход:

ContractNumber|Company|LineShipToCustomer|LineReferenceId|ContractName|ReferenceId
1111111|ABCD INC.|GOOD INC.|123456789_EXP|TEST Contract|123456789
1111111|ABCD INC.|XYZ TELECOM|123456789_TIME|TEST Contract|123456789
222222|FASLSE NEWS INC.|LIVE NEWS INC.|789999_EXP|FALSE NEWS Contract|6789999
222222|FASLSE NEWS INC.|SKY NEWS INC.|789999_TIME|FALSE NEWS Contract|6789999

Большое спасибо, Алед, очень ценю ваше решение! пытается загрузить "выходные данные" в базу данных. какой метод нужно использовать для преобразования данных csv в записи и загрузки в базу данных. Вставьте в db_table(ContractNumber,Company|LineShipToCustomer,LineRefer‌​enceId,ContractName,‌​ReferenceId) значения ('1111111', 'ABCD INC.','GOOD INC.','123456789_EXP','TEST Contract','123456789' ); .... вставить до последней записи (зацикливание/массовая вставка)

Mahari 27.12.2022 18:09

Вы должны задать другой вопрос для части базы данных и оставить этот вопрос для преобразования в CSV. Обратите внимание, что нет необходимости конвертировать в CSV для вставки в базу данных. application/java будет лучшим выходом для этого. Пожалуйста, не стесняйтесь принимать / голосовать за ответ, чтобы показать, что он действителен для сообщества.

aled 27.12.2022 18:14

Большое спасибо!! Код проверен и работает!!! отличная поддержка!!!

Mahari 27.12.2022 18:58

Другие вопросы по теме