我有一些简单的数据想要使用 API Gateway 进行转换:
{
"data": [
{"id":"1", "name":"Foo"},
{"id":"2", "name":"Bar"},
{"id":"3", "name":"Dead"},
{"id":"4", "name":"Beef"}
]
}
我能够循环数据:
#foreach($elem in $input.path('$.data'))
{
"Data": $elem,
"Foo": "Bar"
}#if($foreach.hasNext),#end
#end
预期结果是:
{"Data": {"id":"1", "name":"Foo"}, "Foo": "Bar"},
{"Data": {"id":"2", "name":"Bar"}, "Foo": "Bar"},
{"Data": {"id":"3", "name":"Dead"}, "Foo": "Bar"},
{"Data": {"id":"4", "name":"Beef"}, "Foo": "Bar"}
然而,实际结果是:
{"Data": {id=1, name=Foo}, "Foo": "Bar"},
{"Data": {id=2, name=Bar}, "Foo": "Bar"},
{"Data": {id=3, name=Dead}, "Foo": "Bar"},
{"Data": {id=4, name=Beef}, "Foo": "Bar"}
$elem
产生 {id=1, name=Foo}
,这似乎是对象被字符串化的结果。我想以 JSON 格式保存它,如何实现?
我尝试过
$elem.stringify()
、$input.json($elem)
和 $elem.json()
,但这不起作用。
我想出了一个奇怪的解决方法,阅读有关
$index
以及 Apache Velocity 的工作原理:
#foreach($elem in $input.path('$.data'))
#set($pathBegin = "$.data[")
#set($pathEnd = "]")
#set($currentIndex = $foreach.index)
#set($thePath = "$pathBegin$currentIndex$pathEnd")
#set($elemJson = $input.json($thePath))
{
"Data": $elemJson,
"Foo": "Bar"
}#if($foreach.hasNext),#end
#end
这可能会更优化,但它实际上可以工作并打印出预期的结果。
对 Mikael Dúi Bolinder 上瘾
如果你需要 JSON Stringyfy
只需使用
"$util.escapeJavascript($elemJson)"