将 DynamoDB JSON 转换为 AttributeValue、Go 对象或 Json

Qui*_*Bit 6 json go amazon-dynamodb aws-sdk-go aws-sdk-go-v2

我正在尝试转换简单的 DynamoDB 对象字符串:

{
  "Item": {
    "Id": {
      "S": "db31"
    },
    "CreateTime": {
      "N": "1647882237618915000"
    }
}
Run Code Online (Sandbox Code Playgroud)

到任一dynamodb.AttributeValue映射到 go 对象(go 类型结构)或转换为简单的 JSON go 对象。

我认为,Java中有类似的答案(1、2、3 我在Golang中没有找到类似的实现。

Bri*_*ley 2

您可以创建一个结构类型并用于json.Unmarshal解组 JSON 字符串,如下所示:

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

type Record struct {
    Item struct {
        Id struct {
            S string
        }
        CreateTime struct {
            N string
        }
    }
}

func main() {

    str := `{
  "Item": {
    "Id": {
      "S": "db31"
    },
    "CreateTime": {
      "N": "1647882237618915000"
    }
  }
}`

    var record Record
    if err := json.Unmarshal([]byte(str), &record); err != nil {
        fmt.Fprintf(os.Stderr, "unmarshal failed: %v", err)
        os.Exit(1)
    }

    fmt.Printf("%s %s", record.Item.Id.S, record.Item.CreateTime.N)
}

Run Code Online (Sandbox Code Playgroud)

如果您想要采用不同的方法,并且希望将结果转换为与 JSON 不同的结构,您可以使用gjson之类的库。

下面是一个将结果“扁平化”为更简单的结构的示例:

package main

import (
    "fmt"
    "github.com/tidwall/gjson"
)

type Record struct {
    Id         string
    CreateTime string
}

func main() {

    str := `{
  "Item": {
    "Id": {
      "S": "db31"
    },
    "CreateTime": {
      "N": "1647882237618915000"
    }
  }
}`

    values := gjson.GetMany(str, "Item.Id.S", "Item.CreateTime.N")

    record := Record{
        Id:         values[0].Str,
        CreateTime: values[1].Str,
    }

    fmt.Printf("%s %s", record.Id, record.CreateTime)
}
Run Code Online (Sandbox Code Playgroud)