json - 在 Go 中解析 JSON

标签 json amazon-web-services go

这是为 AWS S3 调用“ListObjects”时的 JSON 输出示例

{
    "Contents": [{
        "ETag": "9e2bc2894b23742b7bb688c646c6fee9",
        "Key": "DSC-0237.jpg",
        "LastModified": "2017-09-06 21:53:15 +0000 UTC",
        "Owner": {
            "DisplayName": "demo-user",
            "ID": "a9e2f170a6880f1d61852df8e523e88ca2a2b7abd093476cc93f1239ab5063c6"
        },
        "Size": 117904,
        "StorageClass": "STANDARD"
    }, {
        "ETag": "\"9e2bc2894b23742b7bb688c646c6fee9\"",
        "Key": "DSC-0238.jpg",
        "LastModified": "2017-09-06 21:52:24 +0000 UTC",
        "Owner": {
            "DisplayName": "demo-user",
            "ID": "a9e2f170a6880f1d61852df8e523e88ca2a2b7abd093476cc93f1239ab5063c6"
        },
        "Size": 117904,
        "StorageClass": "STANDARD"
    }, {
        "ETag": "\"9e2bc2894b23742b7bb688c646c6fee9\"",
        "Key": "DSC-0239.jpg",
        "LastModified": "2017-09-06 21:53:01 +0000 UTC",
        "Owner": {
            "DisplayName": "demo-user",
            "ID": "a9e2f170a6880f1d61852df8e523e88ca2a2b7abd093476cc93f1239ab5063c6"
        },
        "Size": 117904,
        "StorageClass": "STANDARD"
    }],
    "IsTruncated": false,
    "Marker": "",
    "MaxKeys": 5,
    "Name": "test-bucket-x011pp3",
    "Prefix": ""
}

我如何在 Go 中解析它?我主要对收集感兴趣:

  • 桶名
  • key
  • 尺寸
  • 所有者的显示名称
  • 上次修改时间

我来自 Python,在 Python 中它会非常简单,比如:

json_result = json.loads(json_string)
bucket_name = json_result['Name']
for idx, obj in enumerate(json_result['Contents']):
    key = obj['Key']
    size = obj['Size']
    lastmod = obj['LastModified']
    owner= obj['Owner']['DisplayName']

谢谢你的帮助!

最佳答案

是这样的

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "log"
)

var jsonData = []byte(`
{
    "Contents": [{
        "ETag": "9e2bc2894b23742b7bb688c646c6fee9",
        "Key": "DSC-0237.jpg",
        "LastModified": "2017-09-06 21:53:15 +0000 UTC",
        "Owner": {
            "DisplayName": "demo-user",
            "ID": "a9e2f170a6880f1d61852df8e523e88ca2a2b7abd093476cc93f1239ab5063c6"
        },
        "Size": 117904,
        "StorageClass": "STANDARD"
    }, {
        "ETag": "\"9e2bc2894b23742b7bb688c646c6fee9\"",
        "Key": "DSC-0238.jpg",
        "LastModified": "2017-09-06 21:52:24 +0000 UTC",
        "Owner": {
            "DisplayName": "demo-user",
            "ID": "a9e2f170a6880f1d61852df8e523e88ca2a2b7abd093476cc93f1239ab5063c6"
        },
        "Size": 117904,
        "StorageClass": "STANDARD"
    }, {
        "ETag": "\"9e2bc2894b23742b7bb688c646c6fee9\"",
        "Key": "DSC-0239.jpg",
        "LastModified": "2017-09-06 21:53:01 +0000 UTC",
        "Owner": {
            "DisplayName": "demo-user",
            "ID": "a9e2f170a6880f1d61852df8e523e88ca2a2b7abd093476cc93f1239ab5063c6"
        },
        "Size": 117904,
        "StorageClass": "STANDARD"
    }],
    "IsTruncated": false,
    "Marker": "",
    "MaxKeys": 5,
    "Name": "test-bucket-x011pp3",
    "Prefix": ""
}`,
)

type Response struct {
    Contents    []*Content
    IsTruncated bool
    Marker      string
    MaxKeys     int
    Name        string
    Prefix      string
}

type Content struct {
    ETag         string
    Key          string
    LastModified string
    Owner        *Owner
    Size         int
    StroageClass string
}

type Owner struct {
    DisplayName string
    ID          string
}

func main() {
    resp := &Response{}

    if err := json.NewDecoder(bytes.NewBuffer(jsonData)).Decode(resp); err != nil {
        log.Fatal(err)
    }

    fmt.Printf("%#v", resp)
}

Go Playground 中尝试

你应该阅读这个 https://golang.org/pkg/encoding/json/

关于json - 在 Go 中解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46085404/

相关文章:

json - 无法使用 Golang 从 App Engine 将有效的 JSON 数据成功发布到远程 URL

ios - Swift Json 值不断上升为 "nil"

javascript - SyntaxError : JSON. 解析:AJAX 调用中的意外字符错误

java - AWS java lambda 中的 org.postgresql.util.PSQLException : FATAL: database "<<database_name>>" does not exist,

Java Lambda 函数在连接到 Informix DB 时超时

采空区:类型未注册接口(interface):http.gzipReader

go - 无法解码Golang中的数组字段

javascript - 来自 safari/webkit 中 ajax 调用的 json 对象的奇怪行为

java - Spring Rest `@Controller` 扭曲行为

python - 将 Tornado 应用程序部署到 AWS Lambda 时出错