0

我正在嘗試創建一個服務,該服務從dynamo db數據庫輸出json。但是,在亞馬遜網關API中實現主體映射模板之後,該服務僅將dynamodb json的片段轉換爲常規json。日誌中沒有可見的錯誤。我在下面附加了body映射模板,以及GET的響應正文。AWS Gateway API無法將陣列中的DynamoDb JSON轉換爲常規JSON

身體映射模板:

#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 

我已經嘗試了featuers場小sucess.Here格式是我的嘗試:

#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`` 

回答

0

問題是$ 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 

結束

0

是問題的'功能'字段?我認爲你只是在沒有必要時加上引號。

#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 
+0

沒錯,問題是功能領域。它是一個很大的列表,並且會在普通的json中正確格式化,但是它的內容仍然是dynamodb json格式。 – ndeluca18

+0

這似乎只是爲了最小化dynamodb json。 – ndeluca18

+0

那麼你到底在想什麼呢? API網關不知道DDB記錄的模式,所以您必須自己做任何轉換爲​​漂亮的JSON,就像您對其他字段所做的一樣。 –