json - Golang从S3读取JSON到内存中的结构

标签 json amazon-web-services go amazon-s3 unmarshalling

我在S3中有一个JSON文件,它采用以下结构的格式:

type StockInfo []struct {
    Ticker         string `json:"ticker"`
    BoughtPrice    string `json:"boughtPrice"`
    NumberOfShares string `json:"numberOfShares"`
}

我想从S3将其读取为struct值。在python中,代码如下所示:
import boto3
import json

s3 = boto3.client('s3', 'us-east-1')
obj = s3.get_object(Bucket=os.environ["BucketName"], Key=os.environ["Key"])
fileContents = obj['Body'].read().decode('utf-8')
json_content = json.loads(fileContents)

但是,我有点坚持如何在Go中实现这一目标。我已经走了这么远:
package main

import (
    "archive/tar"
    "bytes"
    "fmt"
    "log"
    "os"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
    "github.com/aws/aws-sdk-go/service/s3/s3manager"
    "github.com/joho/godotenv"
)

type StockInfo []struct {
    Ticker         string `json:"ticker"`
    BoughtPrice    string `json:"boughtPrice"`
    NumberOfShares string `json:"numberOfShares"`
}

func init() {
    // loads values from .env into the system
    if err := godotenv.Load(); err != nil {
        log.Print("No .env file found")
    }
    return
}

func main() {
    // Store the PATH environment variable in a variable
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("us-east-1")},
    )
    if err != nil {
        panic(err)
    }

    s3Client := s3.New(sess)
    bucket := "ian-test-bucket-go-python"
    key := "StockInfo.json"

    requestInput := &s3.GetObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
    }
    result, err := s3Client.GetObject(requestInput)
        if err != nil {
             fmt.Println(err)
        }
    fmt.Println(result)

它返回给我body/object缓冲区,但是我不确定如何将其读入字符串,以便可以将其编码到我的结构中。我在类似的问题中找到了此代码:
    requestInput := &s3.GetObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
    }

    buf := new(aws.WriteAtBuffer)
    numBytes, _ := *s3manager.Downloader.Download(buf, requestInput)
    tr := tar.NewReader(bytes.NewReader(buf.Bytes()))

但出现以下错误:
not enough arguments in call to method expression s3manager.Downloader.Download
    have (*aws.WriteAtBuffer, *s3.GetObjectInput)
    want (s3manager.Downloader, io.WriterAt, *s3.GetObjectInput, ...func(*s3manager.Downloader))

multiple-value s3manager.Downloader.Download() in single-value context

谁能指出我正确的方向?与python相比,这样做有点令人沮丧。

最佳答案

我能够使用以下代码来做到这一点:

    requestInput := &s3.GetObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
    }

    result, err := s3Client.GetObject(requestInput)
    if err != nil {
        fmt.Println(err)
    }
    defer result.Body.Close()
    body1, err := ioutil.ReadAll(result.Body)
    if err != nil {
        fmt.Println(err)
    }
    bodyString1 := fmt.Sprintf("%s", body1)

    var s3data StockInfo
    decoder := json.NewDecoder(strings.NewReader(bodyString1))
    err = decoder.Decode(&s3data)
    if err != nil {
        fmt.Println("twas an error")
    }

    fmt.Println(s3data)

关于json - Golang从S3读取JSON到内存中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61924854/

相关文章:

amazon-web-services - 如何使用 golang 从公共(public) s3 存储桶下载

timestamp - SimpleDB 插入时的时间戳

amazon-web-services - 如何在用户数据中重新启动后运行多个 PowerShell 命令?

java - JSON 值中的空格

ios - 如何使用 Swift JSONDecoder 解码可以是数组或单个对象的 JSON 属性?

amazon-web-services - cdk部署是否等待完成部署?

Golang Redis PubSub 超时

go - golang.org 的/x/packages 现在在哪里?

javascript - 从 php 编码的 json 检索数组并将其附加到 div 主体

java - 使用 JSON 文件中的 ListView 的 Android 搜索功能(困难)