Объединение массива JSON из другого родительского массива в мул данных - PullRequest
0 голосов
/ 26 июня 2018

У меня есть JSON, как показано ниже

{
    "packages": [
        {
            "screenings": [
                {
                    "data": {
                        "educationHistory": [
                            {
                                "school": "Test education 4"
                            },
                            {
                                "school": "Test education 4"
                            }
                        ]

                    }
                },
                {
                    "data": {
                        "educationHistory": [
                            {
                                "major": [
                                    "Business Admin."
                                ],
                                "school": "Test education 1"
                            },
                            {
                                "major": [
                                    "Business Admin."
                                ],
                                "school": "Test education 1"
                            }
                        ]

                    }
                }
            ]
        }
    ]
}

В dataweave я написал так

ns0#EmploymentHistory: {(
    payload.packages[0].screenings.data.educationHistory map {
        ns0#Employer: {
            ns0#EmployerName: $.school
        }
    }
)}

Я получаю вывод, как это

<ns0:EmploymentHistory>
<ns0:Employer>
  <ns0:EmployerName>
    <school>Test education 4</school>
    <school>Test education 4</school>
  </ns0:EmployerName>
</ns0:Employer>
<ns0:Employer>
  <ns0:EmployerName>
    <school>Test education 1</school>
    <school>Test education 1</school>
  </ns0:EmployerName>
</ns0:Employer>
</ns0:EmploymentHistory>

Мне нужно, как показано ниже

<ns0:EmploymentHistory>
    <ns0:Employer>
      <ns0:EmployerName>
        <school>Test education 4</school>
      </ns0:EmployerName>
    </ns0:Employer>
    <ns0:Employer>
      <ns0:EmployerName>
        <school>Test education 4</school>
      </ns0:EmployerName>
    </ns0:Employer>
    <ns0:Employer>
      <ns0:EmployerName>
        <school>Test education 1</school>
      </ns0:EmployerName>
    </ns0:Employer>
    <ns0:Employer>
      <ns0:EmployerName>
        <school>Test education 1</school>
      </ns0:EmployerName>
    </ns0:Employer>
</ns0:EmploymentHistory>

Этот xpath payload.packages[0].screenings.data.educationHistory map { проходит через screening, а не educationHistory

1 Ответ

0 голосов
/ 26 июня 2018

Вам нужно использовать селектор потомков, .., чтобы получить все значения educationHistory одновременно. Это будет искать вниз по всему дереву от родительского элемента (в данном случае payload.packages[0]) и захватывать каждый соответствующий дочерний элемент (в данном случае educationHistory). Поскольку educationHistory является массивом в обоих случаях, он будет возвращать массив массивов, поэтому нам нужно использовать flatten, поэтому вместо этого у нас есть массив объектов:

%dw 1.0
%output application/xml

%var employers = flatten payload.packages[0]..educationHistory
---
{
  EmploymentHistory: {
    (employers map {
      Employer: {
        EmployerName: {
          School: $.school
        }
      }
    })
  }
}

Информацию о селекторе потомков можно найти здесь . Вот официальное слово от MuleSoft:

[Селектор потомков] применяется к контексту с использованием формы .. и получает значения всех соответствующих пар ключ: значение в поддереве в текущем контексте. Независимо от иерархической структуры, в которой эти поля организованы, все они размещаются на одном уровне в выходных данных.

...