【问题标题】:AWS SDK GO JSON Unmarshal Nested ResponseAWS 开发工具包 GO JSON 解组嵌套响应
【发布时间】:2021-02-11 09:12:40
【问题描述】:

我正在尝试利用 AWS GO 开发工具包来检索我有权访问“SecretList”的所有 AWS Secret Manager 机密的列表,然后返回嵌套的 ARN 和每个的名称,以便将来的函数循环。当我尝试解组我认为是 JSON 但可能是我不知道的另一种格式的响应时,会弹出问题。

回应

{
  SecretList: [{
      ARN: "arn:aws:secretsmanager:us-east-2:12345676879:secret:service1/secret-1-example-DLGoLU",
      CreatedDate: 1990-09-01 23:26:47.717 +0000 UTC,
      LastAccessedDate: 1990-10-01 00:00:00 +0000 UTC,
      LastChangedDate: 1990-10-01 00:39:08.623 +0000 UTC,
      Name: "service1/secret-1-example",
      SecretVersionsToStages: {
        d35edf0b0-232a-4df2-a723-c873ad5b5ec52: ["AWSCURRENT"]
      }
    },{
      ARN: "arn:aws:secretsmanager:us-east-2:12345676879:secret:service-2/example-2-TXAGC3",
      CreatedDate: 1990-10-01 23:58:32.279 +0000 UTC,
      LastAccessedDate: 1990-10-01 00:00:00 +0000 UTC,
      LastChangedDate: 1990-10-01 02:22:02.525 +0000 UTC,
      Name: "service-2/example-2",
      SecretVersionsToStages: {
        41b456565452-91b8-41e0-a0d5-ac34356a221f3da: ["AWSCURRENT"]
      },
      Tags: [{
          Key: "Team",
          Value: "team"
        },
          Key: "Name",
          Value: "service-2"
        }]
    }]
}

GO代码

package main

import (
    "encoding/json"
    "fmt"

    "github.com/aws/aws-sdk-go/aws/awserr"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/secretsmanager"
)

func getSecretManager() *secretsmanager.SecretsManager {
    sess := session.Must(session.NewSessionWithOptions(session.Options{
        SharedConfigState: session.SharedConfigEnable,
    }))
    return secretsmanager.New(sess)
}

// SecretsList ...
type SecretsList struct {
    SecretList []struct {
        ARN  string `json:"ARN"`
        Name string `json:"name"`
    } `json:"SecretList"`
}

func main() {
    svc := getSecretManager()
    input := &secretsmanager.ListSecretsInput{}
    result, err := svc.ListSecrets(input)
    if err != nil {
        if aerr, ok := err.(awserr.Error); ok {
            switch aerr.Code() {
            case secretsmanager.ErrCodeInvalidParameterException:
                fmt.Println(secretsmanager.ErrCodeInvalidParameterException, aerr.Error())
            case secretsmanager.ErrCodeInvalidNextTokenException:
                fmt.Println(secretsmanager.ErrCodeInvalidNextTokenException, aerr.Error())
            case secretsmanager.ErrCodeInternalServiceError:
                fmt.Println(secretsmanager.ErrCodeInternalServiceError, aerr.Error())
            default:
                fmt.Println(aerr.Error())
            }
        } else {
            // Print the error, cast err to awserr.Error to get the Code and
            // Message from an error.
            fmt.Println(err.Error())
        }
        return
    }
    var secrets SecretsList
    json.Unmarshal([]byte(result.String()), &secrets)
    fmt.Println("SecretList: ", secrets.SecretList[0])
    // json.Unmarshal([]byte(result.String()), &secret)
    // fmt.Println("Secret: ", secret)

    // fmt.Println(secret)
    // fmt.Println(result)
}

【问题讨论】:

  • 可能是SecretList 结构中的大小写问题:Name string 此外,您不需要json:"ARN"json:"SecretList",因为名称与字段匹配。
  • JSON 没有 Date 类型,因此响应中的日期值不是有效的 JSON:CreatedDate: 1990-09-01 23:26:47.717 +0000 UTC

标签: json amazon-web-services go unmarshalling aws-sdk-go


【解决方案1】:

您根本不需要执行 JSON Unmarshal 来检索 ARN 值。文档说明ListSecrets的合同如下:

ListSecrets(input *ListSecretsInput) (*ListSecretsOutput, error)

查看 ListSecretsOutput 对象,有一个 SecretListEntry 类型的嵌套切片,其中包含 Secret 的 ARN、Secret 的名称等。Golang 中的大多数 SDK 函数都遵循类似的格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2020-06-18
    • 2019-06-18
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多