Как сохранить ответ JSON в Dynamodb в GO

Я хочу сохранить ответ JSON в aws-Dynamodb, я использую aws-Dynamodb-sdk. Что я сейчас делаю:

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)
}

Но, как вы можете видеть, данные имеют тип map [string] interface {}, а ожидаемый тип - map [string] * AttributeValue, поэтому дает ошибку компиляции.

Есть ли обходной путь для сохранения ответа json?


person Yash Srivastava    schedule 29.06.2016    source источник


Ответы (3)


Лучший способ поместить 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
}
person Xibz    schedule 13.09.2016
comment
где определяется атрибут Dynamodbattribute? - person Homan; 21.12.2017
comment
пакет - person Xibz; 22.12.2017

В этом случае вы должны использовать утверждение типа.

Попробуйте это:

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)
}
person Endre Simo    schedule 29.06.2016
comment
вы не можете сделать это утверждение недопустимого типа, потому что данные не являются интерфейсом. - person Yash Srivastava; 29.06.2016

Чтобы поместить JSON в aws-Dynamodb, нам сначала нужно перебрать каждый атрибут структуры JSON и преобразовать его в Dynamodb.AttributeValue следующим образом:

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)
}
person Yash Srivastava    schedule 29.06.2016