0

Ich versuche, einen Dienst zu erstellen, der json aus einer Dynamo-Datenbank ausgibt. Nach der Implementierung von body mapping templates in amazon gateway api konvertiert der Dienst jedoch nur Teile des dynamodb json in reguläres json. In den Protokollen ist kein Fehler sichtbar. Ich habe unten die Body-Mapping-Vorlagen und den Antworttext für das GET angehängt.AWS-Gateway-API kann DynamoDb-JSON im Array nicht in reguläre JSON konvertieren

Body Mapping Vorlage:

#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 

Antwort:

{ 
    "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 

ich versucht habe das featuers Feld mit wenig sucess.Here zu formatieren mein Versuch:

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

Antwort

0

Das Problem war, dass $ Elem ist eine Variable, keine Funktion ist, und nicht in der foreach-Schleife wiederverwendet werden können. Ein neuer Name für die Variable muss angegeben werden, z. B. $ elem1. Ich habe unten die endgültige Arbeitskörpervorlage beigefügt.

#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 

Ende

0

Ist das Problem das Feld "Funktionen"? Ich denke, Sie haben nur Zitate hinzugefügt, wenn sie nicht notwendig sind.

#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

Ja, das Problem ist, das Merkmal Feld. Es ist eine große Liste und formatiert korrekt in regulären JSON, jedoch bleibt der Inhalt im dynamodb JSON-Format. – ndeluca18

+0

Dies scheint nur die dynamodb json zu minimieren. – ndeluca18

+0

Was genau denken Sie sollten passieren? Das API-Gateway kennt das Schema des DDB-Datensatzes nicht, daher müssen Sie wie bei den anderen Feldern selbst eine Transformation zu hübschem JSON vornehmen. –