【问题标题】:How to save JSON response in dynamodb in GO如何在 GO 的 dynamodb 中保存 JSON 响应
【发布时间】:2017-03-11 10:58:28
【问题描述】:

我想在 aws-dynamodb 中保存 JSON 响应,我正在使用 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)
}

但是你可以看到 datama​​p[string]interface{} 类型,而预期类型是 ma​​p[string]*AttributeValue 这就是给出编译错误的原因。

是否有任何解决方法来保存 json 响应?

【问题讨论】:

    标签: json go amazon-dynamodb aws-sdk aws-sdk-go


    【解决方案1】:

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

    【讨论】:

    • dynamodbattribute 定义在哪里?
    【解决方案2】:

    在这种情况下你应该使用类型断言。

    试试这个:

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

    【讨论】:

    • 你不能这样做是无效的类型断言,因为数据不是一个接口。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多