2017-11-18 10 views
0

統合レスポンスボディマッピング:データはDynamoDBの表にAWS APIゲートウェイ - 私は次のコードたAWS APIゲートウェイインテグレーションレスポンスボディマッピングで

APIゲートウェイ戻りを照会ラムダ関数から来る

#set($inputRoot = $input.path('$.Item')) 
[ 
#foreach($elem in $inputRoot.Events) 
{ 
    "id": $elem.id, 
    "from" : $elem.from, 
    "to" : $elem.to, 
    "spent" : $elem.spent, 
    #if("$!elem.comment" != "") 
    "comment": $elem.comment,  
    #end 
    "project" : { 
    "id" : $elem.project.id, 
    "number" : $elem.project.number, 
    "name" : $elem.project.name 
    } 
    } 
#if($foreach.hasNext),#end 
#end 
] 

[ 
{ 
    "id": 123443214, 
    "from" : 19:34, 
    "to" : 22:30, 
    "spent" : 02:56, 
    "project" : { 
    "id" : 4321, 
    "number" : CIB, 
    "name" : Backend 
    } 
    } 
, { 
    "id": 12341234, 
    "from" : 19:34, 
    "to" : 22:30, 
    "spent" : 02:56, 
    "project" : { 
    "id" : 12341234, 
    "number" : CIB, 
    "name" : Backend 
    } 
    } 
] 

これは既にフォーマット済みです。どのようにAPi Gatewayに応答がフォーマットされていないのを返すのですか?だからそれはちょうど純粋なjson、ブレークライン、インデントなどなし?

ありがとうございます!

答えて

0

(小さな予告:JSON文字列値の引用符がありません)

それは続くとして、#**#を使用して##とインデントを使用して改行を削除することは可能ですが、テンプレートは醜いビットになります。インデントがここに最初にしている唯一の理由ので

#set($inputRoot = $input.path('$.Item'))## 
[## 
#foreach($elem in $inputRoot.Events)## 
{## 
#**#"id":$elem.id,## 
#**#"from": $elem.from,## 
#**#"to":$elem.to,## 
#**#"spent":$elem.spent,## 
#if("$!elem.comment" != "")## 
#* *#"comment":$elem.comment,## 
#end## 
#**#"project":{## 
#**#"id":$elem.project.id,## 
#**#"number":"$elem.project.number",## 
#**#"name":"$elem.project.name"## 
}## 
}## 
#if($foreach.hasNext),#end## 
#end## 
]## 

の読みやすさでありますテンプレート、私は別の方向に行くだろう。

は、たとえば、あなたがorg.jsonを使用して)あなたのビューサーブレットで後処理きちんとフォーマッタを追加することができます。

import org.json.JSONObject; 
    .... 
Writer writer = new StringWriter(); 
getVelocityView().merge(template, context, writer); 
String compactJSON = new JSONObject(writer.toString()).toString(); 
response.getWriter().write(compactJSON); 

しかし応答がメモリにバッファリングされているので、これはわずかなJSONファイルのために働くだろう、より洗練されたソリューションを探してみましょう。

あなたのテンプレートは、カスタムResouceLoaderを使用して前処理テンプレートになります。

CompactJSONResourceLoader.java

package my.custom.loader; 

import java.io.InputStream; 
import java.io.IOException; 
import org.apache.commons.collections.ExtendedProperties; 
import org.apache.velocity.exception.ResourceNotFoundException; 
import org.apache.velocity.runtime.resource.Resource; 
import org.apache.velocity.runtime.resource.loader.ResourceLoader; 
import org.apache.velocity.runtime.resource.loader.ResourceLoaderFactory; 

public class CompactJSONResourceLoader extends ResourceLoader 
{ 
    protected ResourceLoader innerLoader = null; 

    @Override 
    public void init(ExtendedProperties configuration) 
    { 
     try 
     { 
      String innerLoaderID = configuration.getString("innerLoader") + ".resource.loader"; 
      String innerLoaderClass = rsvc.getConfiguration().getString(innerLoaderID + ".class"); 
      innerLoader = ResourceLoaderFactory.getLoader(rsvc, innerLoaderClass); 
      ExtendedProperties innerConfiguration = rsvc.getConfiguration().subset(innerLoaderID); 
      innerLoader.commonInit(rsvc, innerConfiguration); 
      innerLoader.init(innerConfiguration); 
     } 
     catch (Exception e) 
     { 
      log.error("could not initialize CompactJSONResourceLoader inner loader", e); 
     } 
    } 

    protected class CompactJSONInputStream extends InputStream 
    { 
     InputStream innerStream = null; 
     boolean insideQuotes = false; 

     public CompactJSONInputStream(InputStream innerStream) 
     { 
      this.innerStream = innerStream; 
     } 

     @Override 
     public int read() throws IOException 
     { 
      int ch; 
      do 
      { 
       ch = innerStream.read(); 
       if (insideQuotes) 
       { 
        if (ch == '"') insideQuotes = false; 
        break; 
       } 
       else if (!Character.isWhitespace(ch)) 
       { 
        if (ch == '"') insideQuotes = true; 
        break; 
       } 
      } 
      while (ch != -1); 
      return ch; 
     } 
    } 

    @Override 
    public InputStream getResourceStream(String source) throws ResourceNotFoundException 
    { 
     return new CompactJSONInputStream(innerLoader.getResourceStream(source)); 
    } 

    @Override 
    public boolean isSourceModified(Resource resource) 
    { 
     return innerLoader.isSourceModified(resource); 
    } 

    @Override 
    public long getLastModified(Resource resource) 
    { 
     return innerLoader.getLastModified(resource); 
    } 
} 

そして、あなたは、次のプロパティでベロシティを設定する必要があります:

resource.loader = compact 
compact.resource.loader.class = my.custom.loader.CompactJSONResourceLoader 

compact.resource.loader.innerLoader =ファイル

(もちろん、fileを現在使用しているリソースローダーに置き換えます)。

+0

提案されたカスタムResourceLoaderは、Velocity 1.7 API用であることを追加します。 Velocity 2.0を使用している場合は、ソースをInputStreamの代わりにReaderで直接操作できるようにソースを調整する必要があります。 –

+0

非常に詳細な回答をありがとう!このResourceLoaderが利用できないようにNodeJを使用します。しかし、私のJSON文字列値の引用符がないとうまくいきます...自分の愚かな誤り – Lados

+0

この質問は、おそらく 'velocity'ではなく' velocity.js'というタグが付いているはずです。しかし、それは面白い答えだったと私は喜んで、それは私の最初の速度です。 –

関連する問題