【问题标题】:AWS Gateway API fails to convert DynamoDb JSON in array to regular JSONAWS Gateway API 无法将数组中的 DynamoDb JSON 转换为常规 JSON
【发布时间】:2016-08-13 03:07:48
【问题描述】:

我正在尝试创建一个从 dynamo db 数据库输出 json 的服务。但是,在 amazon gateway api 中实现身体映射模板后,该服务仅将 dynamodb json 的片段转换为常规 json。日志中没有可见的错误。我在下面附上了正文映射模板,以及 GET 的响应正文。

身体映射模板:

    #set($inputRoot = $input.path('$'))
    #foreach($elem in $inputRoot.Items) {
        "accession" : "$elem.accession.S",
        "entryName" : "$elem.entryName.S",
        "sequence" : "$elem.sequence.S",
        "sequenceChecksum" : "$elem.sequenceChecksum.S",
        "taxid" : "$elem.taxid.N",
        "features" : "$elem.features.L"
    } #if($foreach.hasNext),#end
    #end

回复:

 {
   "accession" : "P05067",
   "entryName" : "A4_HUMAN",
   "sequence" : "MLPGLALLLLAAWTARALEVPTDGNAGLLAEPQIAMFCGRLNMHMNVQNGKWDSDPSGTKTCIDTKEGILQYCQEVYPELQITNVVEANQPVTIQNWCKRGRKQCKTHPHFVIPYRCLVGEFVSDALLVPDKCKFLHQERMDVCETHLHWHTVAKETCSEKSTNLHDYGMLLPCGIDKFRGVEFVCCPLAEESDNVDSADAEEDDSDVWWGGADTDYADGSEDKVVEVAEEEEVAEVEEEEADDDEDDEDGDEVEEEAEEPYEEATERTTSIATTTTTTTESVEEVVREVCSEQAETGPCRAMISRWYFDVTEGKCAPFFYGGCGGNRNNFDTEEYCMAVCGSAMSQSLLKTTQEPLARDPVKLPTTAASTPDAVDKYLETPGDENEHAHFQKAKERLEAKHRERMSQVMREWEEAERQAKNLPKADKKAVIQHFQEKVESLEQEAANERQQLVETHMARVEAMLNDRRRLALENYITALQAVPPRPRHVFNMLKKYVRAEQKDRQHTLKHFEHVRMVDPKKAAQIRSQVMTHLRVIYERMNQSLSLLYNVPAVAEEIQDEVDELLQKEQNYSDDVLANMISEPRISYGNDALMPSLTETKTTVELLPVNGEFSLDDLQPWHSFGADSVPANTENEVEPVDARPAADRGLTTRPGSGLTNIKTEEISEVKMDAEFRHDSGYEVHHQKLVFFAEDVGSNKGAIIGLMVGGVVIATVIVITLVMLKKKQYTSIHHGVVEVDAAVTPEERHLSKMQQNGYENPTYKFFEQMQN",
   "sequenceChecksum" : "A12EE761403740F5",
   "taxid" : "9606",
   "features" : "[{"M":{"category":{"S":"MOLECULE_PROCESSING"},"description":{"S":" "},"type":"category":{"S":"MOLECULE_PROCESSING"},"description":{"S":"Amyloid beta A4 protein"},"type":{"S":"CHAIN"},"end":{"S":"770"},"begin":{"S":"18"}}},{"M":{"ftId":{"S":"PRO_0000000089"},"category":{"S":"MOLECULE_PROCESSING"},"description":{"S":"Soluble APP-alpha"},"type":{"S":"CHAIN"},"end":{"S":"687"},"begin":{"S":"18"}}},{"M":{"ftId":{"S":"PRO_0000000090"},"category":{"S":"MOLECULE_PROCESSING"},"description":{"S":"Soluble APP-beta"},"type":{"S":"CHAIN"},"end":{"S":"671"},"begin":{"S":"18"}}},{"M":{"ftId":{"S":"PRO_0000381966"},"category":{"S":"MOLECULE_PROCESSING"},"description":{"S":"N-APP"},"type":{"S":"CHAIN"},"end":{"S":"286"},"begin":{"S":"18"}}},{"M":{"ftId":{"S":"PRO_0000000091"},"category":{"S":"MOLECULE_PROCESSING"},"description":{"S":"C99"},"type":{"S":"CHAIN"},"end":{"S":"770"},"begin":{"S":"672"}}},{"M":{"ftId":{"S":"PRO_0000000092"},"category":{"S":"MOLECULE_PROCESSING"},"description":{"S":"Beta-amyloid protein 42"},"type":{"S":"CHAIN"},"end":{"S":"713"},"begin":{"S":"672"}}}]"
        }         
Response Headers
{"Content-Type":"application/json"}
Logs
Execution log for request test-request
Mon Aug 08 15:26:05 UTC 2016 : Starting execution for request: test-invoke-request
Mon Aug 08 15:26:05 UTC 2016 : HTTP Method: GET, Resource Path: /proteins/{accession}
Mon Aug 08 15:26:05 UTC 2016 : Method request path: {accession=P05067}
Mon Aug 08 15:26:05 UTC 2016 : Method request query string: {}
Mon Aug 08 15:26:05 UTC 2016 : Method request headers: {}
Mon Aug 08 15:26:05 UTC 2016 : Method request body before transformations: null
Mon Aug 08 15:26:05 UTC 2016 : Endpoint request URI: https://dynamodb.us-west-2.amazonaws.com/?Action=Query
Mon Aug 08 15:26:05 UTC 2016 : Endpoint request headers: {Authorization=****************************************************************************************************************************************************************************************************************************************************************************************b0b302, X-Amz-Date=20160808T152605Z, x-amzn-apigateway-api-id=9x56sueb85, Accept=application/json, User-Agent=AmazonAPIGateway_9x56sueb85, X-Amz-Security-Token=AgoGb3JpZ2luEJv//////////wEaCXVzLXdlc3QtMiKAAlXlB1cz9vo5Kf2llpupTpP1fTiHMBBbZhOmQW30/jCc5Q3RV+BM9k0LtqfJXRdRpzw5DEHg1dmlA1k8Ljha+og4RGYFdpj/9wdc4u1WKnZdy/lZFUAMey0YotNc+RniWyMq+ZiVhY94Sv/zKJ+dxSGkDZbz5A6Jbfj4EfVFuMLC3kHA4tJKWp6PCXpyHJqFqQ+UuI/q0coHNQv0euBD6hNUBOEBZes2TIQdTha8f4k+avX7o1f3LcpIjfvdPN4InOXZ7ZMHDgpLEuxurOZ7taZjoXftHxpRG2GAciTNj7gQASCsxRAQL/4gujC6yydGievEE6V5Zn5prIRnHPz0Lmcq8QII8f//////////ARAAGgw5MTUzMzI4Mzc1NDAiDD4AxveOBPRjUQ28ZirFAj5mJUN8gxUfXUQc1AzD08pLgpAtrz11K1Xgax/ATvptUj//Pcy+4fS90PqdZSqMSmS8KsD0X46m7GfhNNzuQypCdY3lyyN [TRUNCATED]
Mon Aug 08 15:26:05 UTC 2016 : Endpoint request body after transformations: {
    "TableName": "Protein_DB",
    "IndexName": "accession-index",
    "KeyConditionExpression": "accession = :v1",
        "ExpressionAttributeValues": {
            ":v1":  {
                "S": "P05067"
            }
        }
}
Mon Aug 08 15:26:05 UTC 2016 : Endpoint response body before transformations: {"Count":1,"Items":[{"accession":{"S":"P05067"},"features":{"L":[{"M":{"category":{"S":"MOLECULE_PROCESSING"},"description":{"S":" "},"type":{"S":"SIGNAL"},"evidences":{"L":[{"M":{"source":{"M":{"id":{"S":"12665801"},"alternativeUrl":{"S":"http://europepmc.org/abstract/MED/12665801"},"name":{"S":"PubMed"},"url":{"S":"http://www.ncbi.nlm.nih.gov/pubmed/12665801"}}},"code":{"S":"ECO:0000269"}}},{"M":{"source":{"M":{"id":{"S":"2900137"},"alternativeUrl":{"S":"http://europepmc.org/abstract/MED/2900137"},"name":{"S":"PubMed"},"url":{"S":"http://www.ncbi.nlm.nih.gov/pubmed/2900137"}}},"code":{"S":"ECO:0000269"}}},{"M":{"source":{"M":{"id":{"S":"3597385"},"alternativeUrl":{"S":"http://europepmc.org/abstract/MED/3597385"},"name":{"S":"PubMed"},"url":{"S":"http://www.ncbi.nlm.nih.gov/pubmed/3597385"}}},"code":{"S":"ECO:0000269"}}}]},"end":{"S":"17"},"begin":{"S":"1"}}},{"M":{"ftId":{"S":"PRO_0000000088"},"category":{"S":"MOLECULE_PROCESSING"},"description":{"S":"Amyloid b [TRUNCATED]
Mon Aug 08 15:26:05 UTC 2016 : Endpoint response headers: {x-amzn-RequestId=J0J7K1RFDOGEK20V70T0HKJ14JVV4KQNSO5AEMVJF66Q9ASUAAJG, x-amz-crc32=273504943, Content-Length=75281, Date=Mon, 08 Aug 2016 15:26:05 GMT, Content-Type=application/x-amz-json-1.0}
Mon Aug 08 15:26:05 UTC 2016 : Method response body after transformations: 
         {
            "accession" : "P05067",
            "entryName" : "A4_HUMAN",
            "sequence" : "MLPGLALLLLAAWTARALEVPTDGNAGLLAEPQIAMFCGRLNMHMNVQNGKWDSDPSGTKTCIDTKEGILQYCQEVYPELQITNVVEANQPVTIQNWCKRGRKQCKTHPHFVIPYRCLVGEFVSDALLVPDKCKFLHQERMDVCETHLHWHTVAKETCSEKSTNLHDYGMLLPCGIDKFRGVEFVCCPLAEESDNVDSADAEEDDSDVWWGGADTDYADGSEDKVVEVAEEEEVAEVEEEEADDDEDDEDGDEVEEEAEEPYEEATERTTSIATTTTTTTESVEEVVREVCSEQAETGPCRAMISRWYFDVTEGKCAPFFYGGCGGNRNNFDTEEYCMAVCGSAMSQSLLKTTQEPLARDPVKLPTTAASTPDAVDKYLETPGDENEHAHFQKAKERLEAKHRERMSQVMREWEEAERQAKNLPKADKKAVIQHFQEKVESLEQEAANERQQLVETHMARVEAMLNDRRRLALENYITALQAVPPRPRHVFNMLKKYVRAEQKDRQHTLKHFEHVRMVDPKKAAQIRSQVMTHLRVIYERMNQSLSLLYNVPAVAEEIQDEVDELLQKEQNYSDDVLANMISEPRISYGNDALMPSLTETKTTVELLPVNGEFSLDDLQPWHSFGADSVPANTENEVEPVDARPAADRGLTTRPGSGLTNIKTEEISEVKMDAEFRHDSGYEVHHQKLVFFAEDVGSNKGAIIGLMVGGVVIATVIVITLVMLKKKQYTSIHHGVVEVDAAVTPEERHLSKMQQNGYENPTYKFFEQMQN",
            "sequenceChecksum" : "A12EE761403740F5",
            "taxid" : "9606",
             [TRUNCATED]
Mon Aug 08 15:26:05 UTC 2016 : Method response headers: {Content-Type=application/json}
Mon Aug 08 15:26:05 UTC 2016 : Successfully completed execution
Mon Aug 08 15:26:05 UTC 2016 : Method completed with status: 200

我尝试格式化特征字段但收效甚微。这是我的尝试:

#set($inputRoot = $input.path('$'))

        #foreach($elem in $inputRoot.Items) {
            "accession" : "$elem.accession.S",
            "entryName" : "$elem.entryName.S",
            "sequence" : "$elem.sequence.S",
            "sequenceChecksum" : "$elem.sequenceChecksum.S",
            "taxid" : "$elem.taxid.N",
            "features" : "$elem.features.L"
        }#if($foreach.hasNext),#end
#end

#foreach($elem in $inputRoot.Items.features)
      {
        "alternativeSequence": "$elem.alternativeSequence.S",
        "begin": "$elem.begin.S",
        "category": "$elem.category.S",
        "description": "$elem.description.S",
        "end": "$elem.end.S",
        "evidences": "$elem.evidences.L",
        "ftID": "$elem.ftId.S",
        "type": "$elem.type.S"
      }#if($foreach.hasNext),#end

#end``

【问题讨论】:

    标签: json amazon-web-services amazon-dynamodb aws-api-gateway


    【解决方案1】:

    问题是“功能”字段吗?我认为您只是在不需要时添加了引号。

    #set($inputRoot = $input.path('$'))
    #foreach($elem in $inputRoot.Items) {
        "accession" : "$elem.accession.S",
        "entryName" : "$elem.entryName.S",
        "sequence" : "$elem.sequence.S",
        "sequenceChecksum" : "$elem.sequenceChecksum.S",
        "taxid" : "$elem.taxid.N",
        "features" : $elem.features.L
    } #if($foreach.hasNext),#end
    #end
    

    【讨论】:

    • 是的,问题出在 features 字段上。这是一个很大的列表,并且会以常规 json 格式正确格式化,但是,它的内容仍然是 dynamodb json 格式。
    • 这似乎只是取消最小化 dynamodb json。
    • 那么您到底认为应该发生什么? API Gateway 不知道 DDB 记录的架构,因此您必须自己对漂亮的 JSON 进行任何转换,就像您对其他字段所做的那样。
    • 我不知道如何修改 features 数组的内容,使其成为常规 JSON。
    【解决方案2】:

    问题在于 $elem 是一个变量而不是一个函数,并且不能在 foreach 循环中重用。必须为变量指定一个新名称,例如 $elem1。我已在最终工作体模板下方附上。

    #set($inputRoot = $input.path('$'))
    
         #foreach($elem in $inputRoot.Items) {
            "accession" : "$elem.accession.S",
            "entryName" : "$elem.entryName.S",
            "sequence" : "$elem.sequence.S",
            "sequenceChecksum" : "$elem.sequenceChecksum.S",
            "taxid" : $elem.taxid.N,
            "features" : [
                            #foreach($elem1 in $elem.features.L){
                                "alternativeSequence": "$elem1.M.alternativeSequence.S",
                                "begin": "$elem1.M.begin.S",
                                "category": "$elem1.M.category.S",
                                "description": "$elem1.M.description.S",
                                "end": "$elem1.M.end.S",
                                "evidences": [
                                                #foreach($elem2 in $elem1.M.evidences.L){
                                                    "code":"$elem2.M.code.S",
                                                    "source" : #foreach($elem3 in $elem2.M.source){
                                                               "alternativeUrl" : "$elem3.alternativeUrl.S",
                                                               "id":"$elem3.id.S",
                                                               "name":"$elem3.name.S",
                                                               "url":"$elem3.url.S",
                                                           }#if($foreach.hasNext),#end
                                                           #end
                                                }#if($foreach.hasNext),#end
                                                #end
                                            ],
                                "ftID": "$elem1.M.ftId.S",
                                "type": "$elem1.M.type.S"
                            }#if($foreach.hasNext),#end
                            #end
                        ]
        }#if($foreach.hasNext),#end
    

    结束

    【讨论】:

      猜你喜欢
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 2020-07-15
      • 2016-02-08
      • 1970-01-01
      • 2016-07-25
      相关资源
      最近更新 更多