Преобразование DynamoDB JSON в AttributeValue, Go Object или Json

Я пытаюсь преобразовать простую строку объекта DynamoDB:

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

либо в dynamodb.AttributeValue, а затем сопоставить с объектом go (структура типа go) или преобразовать в простой объект JSON go.

Думаю, похожие ответы (1 , 2 , 3) есть и в Java, но подобной реализации в Golang я не нашел.

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
5
0
153
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать тип структуры и использовать 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)
}


Если вам нужен другой подход и вы хотите преобразовать результат в структуру, отличную от 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)
}

да, это то, что я делаю, но доступ к вещам начинает выглядеть так: item.M["third"].B, и если структуры более вложены, потому что хранимые объекты более сложны, становится очень утомительно читать и понимать. Я надеялся, что в aws sdk будет функция, которая могла бы абстрагировать все эти типы данных DynamoDB и Unmarshal во что-то, что больше похоже на объект JSON/GO. Кроме того, тот, кто не знаком с типами Dyn и представлением объектов JSONL, определенно будет сбит с толку.

QuirkyBit 01.12.2022 15:30

Кроме того, как насчет предметов/объектов неизвестной схемы/структуры? Есть ли в AWS SDK код, который автоматически сопоставляет типы DynamoDB с типами JSON/GO?

QuirkyBit 01.12.2022 16:25

Проверьте мое редактирование. Вы можете использовать библиотеку, например gjson, для преобразования данных в более чистую структуру, если это то, что вы ищете.

Brian Pursley 02.12.2022 02:42

Я надеялся, что в Go это будет более автоматизировано, как в Java, но это сойдет. Спасибо!

QuirkyBit 15.12.2022 19:49

Другие вопросы по теме