2016-06-29 11 views
2

aws-dynamodbでJSONレスポンスを保存したい、私はaws-dynamodb-sdkを使用しています。私が現在やっていることは次のとおりです。GOでdynamodbでJSONレスポンスを保存するには

func (e *DB) saveToDynamodb(data map[string]interface{}){ 
params := &dynamodb.PutItemInput{ 
    Item: map[string]*dynamodb.AttributeValue{ 
     "Key": { 
      M: data, 
     }, 
    }, 
    TableName: aws.String("Asset_Data"), 
} 
resp, err := e.dynamodb.PutItem(params) 

if err != nil { 
    fmt.Println(err.Error()) 
    return 
} 
fmt.Println(resp) 
} 

しかし、期待されるタイプは、マップ[文字列]にあるときにデータを見ることができるようにすることはマップ[文字列]インターフェース{}型である* AttributeValueの理由だとコンパイルエラーが発生します。

jsonレスポンスを保存するための回避策はありますか?

答えて

0

を、我々は最初の構造体JSONの各属性を反復処理し、次のようにdynamodb.AttributeValueに変換する必要がありAWS-DynamoDBの中でJSONを配置するには:

func (e *DB) saveToDynamodb(data map[string]interface{}){ 
var vv=make(map[string]*dynamodb.AttributeValue) 

for k,v:=range data{ 
    x:=(v.(string)) //assert string type 
    xx:=&(x) 
    vv[k]=&dynamodb.AttributeValue{S: xx,} 
} 
//s:=data["asset_id"].(string) 
params := &dynamodb.PutItemInput{ 
    Item: vv, 
    TableName: aws.String("Asset_Data"), // Required 
} 
resp, err := e.dynamodb.PutItem(params) 

if err != nil { 
    // Print the error, cast err to awserr.Error to get the Code and 
    // Message from an error. 
    fmt.Println(err.Error()) 
    return 
} 

// Pretty-print the response data. 
fmt.Println(resp) 
} 
0

この場合、タイプアサーションを使用する必要があります。

はこれにそれを試してみる:

func (e *DB) saveToDynamodb(data map[string]interface{}){ 
    params := &dynamodb.PutItemInput{ 
     Item: map[string]*dynamodb.AttributeValue{ 
      "Key": { 
       M: data.(map[string]*dynamodb.AttributeValue), // assert interface to *dynamodb.AttributeValue 
      }, 
     }, 
     TableName: aws.String("Asset_Data"), 
    } 
    resp, err := e.dynamodb.PutItem(params) 

    if err != nil { 
     fmt.Println(err.Error()) 
     return 
    } 
    fmt.Println(resp) 
} 
+0

データはインタフェースではありませんので、あなたはそれが無効な型アサーションだということはできません。 –

2

jsonをDynamoDBに追加する最も良い方法は、ヘルパー関数を使用することです。

func ExampleMarshal() (map[string]*dynamodb.AttributeValue, error) {                          
    type Record struct {                          
    Bytes []byte                           
    MyField string                           
    Letters []string                          
    Numbers []int                           
    }                               

    r := Record{                            
    Bytes: []byte{48, 49},                        
    MyField: "MyFieldValue",                        
    Letters: []string{"a", "b", "c", "d"},                     
    Numbers: []int{1, 2, 3},                        
    }                               
    av, err := dynamodbattribute.Marshal(r) 
    return map[string]*dynamodb.AttributeValue{"object":av}, err 
} 
+0

dynamodbattributeはどこに定義されていますか? – Homan

+0

[パッケージ](https://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/dynamodbattribute/) – Xibz

関連する問題