【问题标题】:Create JSON Object with Velocity Template Language使用 Velocity 模板语言创建 JSON 对象
【发布时间】:2019-08-03 22:22:42
【问题描述】:

我正在使用 AWS AppSync 中的 Apache Velocity 模板语言 (VTL)。 在我的请求模板中,我查询了具有不同元素的未定义数量的项目。 我想要在响应模板中做的是将结果转换为 JSON 对象,稍后我需要它来执行 BatchDeleteItem 操作。 这是我目前解决的方法:

#set($deleteObject='{"Id" : { "S": "nodelete" },"Sk" : { "S": "nodelete" }}')
#set($replaceDeleteObject ="")
#set($separator="")

#foreach( $item in $ctx.result.items )
  #set($replaceDeleteObject = $replaceDeleteObject + $separator + '{"Id" : { "S": "' + $item.Id + '" },"Sk" : { "S": "' + $item.Sk + '" }}')
  #set($separator = ",")
  #set($deleteObject = $replaceDeleteObject)
#end

$util.qr($ctx.stash.put("deleteObject", $deleteObject))

稍后我可以访问我的 deleteObject 并且它可以正常工作。

然而我的问题是,是否可以在 vtl 中直接创建某种 JSON 对象,我可以在其中附加我的值,而不是以 JSON 对象的形式创建此字符串?

【问题讨论】:

    标签: amazon-web-services aws-appsync vtl apache-velocity


    【解决方案1】:

    您可以从AppSync Batch docs 中遵循此示例:

    #set($ids = [])
    #foreach($id in ${ctx.args.ids})
        #set($map = {})
        $util.qr($map.put("id", $util.dynamodb.toString($id)))
        $util.qr($ids.add($map))
    #end
    
    {
        "version" : "2018-05-29",
        "operation" : "BatchGetItem",
        "tables" : {
            "Posts": {
                "keys": $util.toJson($ids),
                "consistentRead": true
            }
        }
    }
    

    所以对于你的情况,它应该是这样的:

    #set ($batchDeleteArray = [])
    #foreach( $item in $ctx.result.items )
      #set ($entry = {
        "Id": $util.dynamodb.toString($item.Id),
        "Sk": $util.dynamodb.toString($item.Sk)
      })
    
      $util.qr($batchDeleteArray.add($entry))
    #end
    
    {
        "version" : "2018-05-29",
        "operation" : "BatchDeleteItem",
        "tables" : {
            "TableName": {
              "keys": $util.toJson($batchDeleteArray)
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以创建一个接近您需要的 JSON 对象的地图/字典。有一个编程指南here 应该有你需要的信息,但基本上你想要的是这样的。

      #set($deleteObject={
           "Id" : $util.dynamodb.toString("nodelete"),
           "Sk" : $util.dynamodb.toString("nodelete")
      })
      

      【讨论】:

      • 不幸的是,我有多个项目会附加到对象数组中。地图/字典无法做到这一点
      猜你喜欢
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 2022-09-27
      • 2019-05-05
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      相关资源
      最近更新 更多