Как разбить большой ответ Json на несколько Json в dataweave 2?

У меня есть ответ json, который мне нужно разбить на несколько частей, прежде чем отправлять его в целевую систему.

Я пытался с for-each, но не смог достичь желаемого результата.

входной json выглядит так

{
    parent :
    {
        child:
            [{
                a:[{},{},{},{}]
            }]  
    }
}

и должен выглядеть как эта часть1

{
    parent :
    {
        child:
            [{
                a:[{},{}]
            }]  
    }
}

часть 2

{
    parent :
    {
        child:
            [{
                a:[{},{}]
            }]  
    }
}

Может ли кто-нибудь помочь мне здесь?


person Rahul Sevani    schedule 10.05.2019    source источник
comment
Обновленный ответ, поскольку вопрос был отредактирован для изменения ввода / вывода   -  person Ryan Carter    schedule 10.05.2019


Ответы (1)


Трудно сказать на основе вашего образца json, поскольку это не отформатированный json.

ПРИМЕЧАНИЕ. Ожидаемый ввод / вывод изменился по сравнению с моим исходным ответом, поэтому это обновление.

Однако это работает и может быть изменено в зависимости от вашего фактического ввода.

Во-первых, используйте foreach для итерации части сбора ваших полезных данных (в соответствии с вашим примером это #[flatten(payload.parent.child.a)] (но это может измениться, поскольку неясно, будет ли «дочерний» массив также иметь более одного элемента).

Вы также не упоминаете, как хотите его разделить. Основываясь на вашем примере, это для каждых 2 записей. Поэтому используйте атрибут batchSize и установите значение 2 (измените его на свое фактическое требование).

Затем вам нужно добавить обертывающие элементы json обратно, так как вы потеряете это в foreach:

  <foreach doc:name="For Each"  collection="#[flatten(payload.parent.child.a)]" batchSize="2">
            <ee:transform doc:name="Transform Message" doc:id="7b1cccb7-fcbb-41b3-a08f-bac5600df2f2" >
                <ee:message >
                    <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
    parent :
    {
        child:[
           a: payload
        ]
    }
}]]></ee:set-payload>
                </ee:message>
            </ee:transform>
            <logger level="ERROR" message="Split items here: #[payload]" />
        </foreach>

Результат соответствует вашему новому ожидаемому результату:

  Split items here: {
      "parent": {
    "child": [
      {
        "a": [
          {

          },
          {

          }
        ]
      }
    ]
  }
}

Split items here: {
  "parent": {
"child": [
  {
    "a": [
      {

      },
      {

      }
    ]
  }
]

} }

person Ryan Carter    schedule 10.05.2019
comment
Спасибо за помощь. Я хотел добиться того же без использования for-each, но, похоже, другого решения нет. :) - person Rahul Sevani; 10.05.2019
comment
Верно. Нет, если вы хотите вызывать отдельные процессоры для каждой партии - person Ryan Carter; 10.05.2019