Как преобразовать массив в json, используя шаблон скорости для шлюза aws api?

Я работал над написанием шаблонов скорости для aws api-gateway, чтобы преобразовать ответ json от моего API, чтобы дать последовательный ответ пользователю.

Я пытался преобразовать этот json:

{
    "amountCharges": [
        "charge1", "charge2", "charge3"
    ]
}

к этому ожидаемому:

{
    "charges": [
        "charge1", "charge2", "charge3"
    ]
}

Я смог создать массив для объектов, используя этот шаблон:

#set( $inputRoot = $input.path('$') )
"charges": [
    #foreach( $charge in $inputRoot.charges )
    {
        "type": "$charge.chargeType",
        "name": "$charge.chargeName",
        "amount": {
            "value": $charge.chargeAmount.amountValue,
            "currency": "$charge.chargeAmount.amountCurrency"
        },
        #if( $charge.chargeTax )
            "tax": {
                "name": "$charge.chargeTax.taxName",
                "amount": {
                    "value": $charge.chargeTax.taxAmount.amountValue,
                    "currency": "$charge.chargeTax.taxAmount.amountCurrency"
                }
            }
        #end
    }
    #if( $foreach.hasnext ) , #end
    #end
]

в то время как этот шаблон смог преобразовать мой массив объектов json в желаемый ответ. Пример, упомянутый ниже:

{         
    "charges": [
    {
        "chargeType": "someType1",
        "chargeName": "someName1",
        "chargeAmount": {
            "amountValue": 5,
            "amountCurrency": "someCurrency1"
        },
        "chargeTax": {
            "taxName": "someTax1",
            "taxAmount": {
                "amountValue": 5,
                "amountCurrency": "someCurrency1"
            }
        }
    },
    {
        "chargeType": "someType2",
        "chargeName": "someName2",
        "chargeAmount": {
            "amountValue": 10,
            "amountCurrency": "someCurrency2"
        }
    }
    ]
}

шаблон преобразовал этот json в ожидаемый результат:

{
    "charges": [
    {
        "type": "someType1",
        "name": "someName1",
        "amount": {
            "value": 5,
            "currency": "someCurrency1"
        },
        "tax": {
            "name": "someTax1",
            "amount": {
                "value": 5,
                "currency": "someCurrency1"
            }
        }
    },
    {
        "type": "someType2",
        "name": "someName2",
        "amount": {
            "value": 10,
            "currency": "someCurrency2"
        }
    }
    ]
}

в основном, я хочу преобразовать массив строк, а не пару ключ-значение. Любые выводы будут полезны. заранее спасибо.


person Abhinandan Mittal    schedule 22.02.2020    source источник


Ответы (1)


Просто нужна простая настройка с моей стороны:

#set( $inputRoot = $input.path('$') )
"charges": [
    #foreach( $amountCharge in $inputRoot.amountCharges )
        "$amountCharge"
        #if( $foreach.count < $inputRoot.amountCharges.size() ) , #end\
    #end
] 
person Abhinandan Mittal    schedule 22.02.2020
comment
Вместо того, чтобы сравнивать: count ‹ size: #if($foreach.hasNext), #end -- вы делаете это в содержании вопроса, но вы отвечаете менее эффективным методом ¯\_(ツ)_/¯ - person cynicaljoy; 09.12.2020
comment
@cynicaljoy Сначала я пробовал только #if($foreach.hasNext), #end. По какой-то причине API Gateway игнорирует это в моем случае. Служба поддержки AWS также не смогла решить проблему. Просто использовал это как обходной путь. - person Abhinandan Mittal; 10.12.2020