Я пытаюсь создать группу с двумя полями и суммой, но, похоже, не могу заставить ее работать для меня. Любая помощь приветствуется

Я хочу преобразовать XML в JSON. Ниже приведены мои данные и требования.

У меня ниже XMl:

    <Message>
    <OrderList>
        <Order>
            <PaymentMethods>
                <PaymentMethod FirstName="Avnish" LastName="Singh" PaymentType="Card" CreditCardNo="1111" CreditCardType="VISA" AmountToRefund="10" />
                <PaymentMethod FirstName="Avnish" LastName="Singh" PaymentType="Card" CreditCardNo="2222" CreditCardType="MASTER" AmountToRefund="20" />
            </PaymentMethods>
        </Order>
        <Order>
            <PaymentMethods>
                <PaymentMethod FirstName="Avnish" LastName="Singh" PaymentType="Card" CreditCardNo="1111" CreditCardType="VISA" AmountToRefund="10" />
                <PaymentMethod FirstName="Avnish" LastName="Singh" PaymentType="Card" CreditCardNo="2222" CreditCardType="MASTER" AmountToRefund="20" />
                <PaymentMethod FirstName="Avnish" LastName="Singh" PaymentType="Card" CreditCardNo="3333" CreditCardType="VISA" AmountToRefund="12" />
            </PaymentMethods>
        </Order>
    </OrderList>
</Message>

Я пробовал ниже, используя groupBy и sum, используя приведенный ниже код, но не получил ожидаемого результата, как показано ниже:

    {
    "template_attributes": {
        "payment_methods": payload.Message.OrderList..*PaymentMethod groupBy ($.CreditCardType ++ $.CreditCardNo) map ((paymentMethod, index) -> {
            "first_name": paymentMethod.@FirstName,
            "last_name": paymentMethod.@LastName,
            "card_type": paymentMethod.@CreditCardType,
            "card_no": paymentMethod.@CreditCardNo,
            "amount_to_refund": paymentMethod.@AmountToRefund,
            "payment_type": sum paymentMethod.@PaymentType

        })
        }
}

Я хочу ниже вывод, где все способы оплаты должны быть объединены на основе card_type и credit_card_no:

 template_attributes:{
    payment_methods:[
        {
            first_name: "Avnish",
            last_name: "Singh",
            credit_card_no: "1111",
            card_type: "VISA",
            amount: "20"
        },
        {
            first_name: "Avnish",
            last_name: "Singh",
            credit_card_no: "2222",
            card_type: "MASTER",
            amount: "40"
        },
        {
            first_name: "Avnish",
            last_name: "Singh",
            credit_card_no: "3333",
            card_type: "VISA",
            amount: "12"
        }
    ]
}

person Avnish Kumar Singh    schedule 27.05.2019    source источник


Ответы (1)


Привет, я думаю, вы используете mule 3.x, поэтому dw 1.0. Тогда решение вашей проблемы. Используйте оператор pluck для работы с объектом, как если бы он был массивом пар ключ-значение.

{
  "template_attributes": {
    "payment_methods": 
        payload.Message.OrderList..*PaymentMethod 
            groupBy ((value) -> value.@CreditCardType ++ value.@CreditCardNo)             
            pluck ((paymentMethod, key) -> {
                "first_name": paymentMethod[0].@FirstName,
                "last_name": paymentMethod[0].@LastName,
                "card_type": paymentMethod[0].@CreditCardType,
                "card_no": paymentMethod[0].@CreditCardNo,
                "amount_to_refund": sum paymentMethod.@AmountToRefund,
                "payment_type": paymentMethod[0].@PaymentType
            })
  }
}
person machaval    schedule 27.05.2019