Golang中如何将字符串读取器作为键值对使用
Golang中如何将字符串读取器作为键值对使用 你好,
我有一个AWS Lambda的GetFunction函数返回了一个结构体,我正在使用接口并将其转换为字符串对象,如下所示。
代码:
{
Location: “https://prod-04-2014-tasks.s3.us-east-1.amazonaws.com/snapshots/752617210841/aa88466lambda3380-9dfdc63f-fc20-450c-a5ae-adc2195ee894?versionId=YEiIP0TAPyHeihanSZXqdNDg5WES.A2k&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEGYaCXVzLWVhc3QtMSJIMEYCIQCEcqO3Hw5g3MGXiUm1CKRrQ0Y3IxNipmS%!B(MISSING)WULAP3z6MQIhANHUJJWCcW4CA3TcUCliX9f%!B(MISSING)e6Q8L9ra3OECC06bPI2mKr0DCI7%!F(MISSING)%!F(MISSING)%!F(MISSING)%!F(MISSING)%!F(MISSING)%!F(MISSING)%!F(MISSING)%!F(MISSING)%!F(MISSING)%!F(MISSING)wEQABoMNzQ5Njc4OTAyODM5IgxlfBP0AVZb1KchARQqkQOM30%!F(MISSING)rhH4r6lwTVUpuG7x5FQg7EyyyymWh9LCzlbrJM9FCBj1S1aKITCvuc6h2uYZnzf9n0xRuVRk9TcUCa7EQs2Ah5HC03IJAj%!B(MISSING)dZavF8cBfBDRMAjJbM2YITnq26xaJbA6UR%!B(MISSING)3airnm1inIKx5713XM3lmvEIraGJYYPT1%!F(MISSING)xfUVA6TbE8ee%!B(MISSING)pnghmOiyt5x53MU2Hge9pvQ2kBlA3Rpo1ERAC3lYdVpyOFsqDLE%!B(MISSING)TcAWQIN73MUF%!B(MISSING)AGbXhd%!F(MISSING)%!B(MISSING)35tsLZ5Cdq8o1YNgGZQ9y9xvwoGX6IPsFVHI%!B(MISSING)xbCgQdqEr9PUrBEXViYpYIYKTmh4zmS9JCsPaur9GXJaW3iq1FOrFFWiyKo23oji2D9FYZDRVdh6pyVsorDnCJKS0kO6oYgZne0YiMClfNWxCAr7AuaIiVhyYNUSLxuq1kzlH71FuIY3FFL1H2mQSbOO2dpXoB3IWi5r7CottNYorGDBEirFJdlyNlF%!B(MISSING)1VwUmyXmqnsJD5Jki8ZmpcDwoymukT4KjzWYy34wRbGqNajQePLzuubTC6r6iCBjrqAZL3ZZbKoYA9khSGBfAaR3k39VDlO0xvHDrUjQLYrkfwlHcQsfI%!B(MISSING)0ay3Hin0HBkJ1NUuMZEpRz1vgiERJr3jv3nREskZccU8wFnFkckDiQdtHDcO%!F(MISSING)ieFMHWQEU1LPc1o26XHCZk%!B(MISSING)pEXXvYWimIbhJJuSl7gn30KrDtf%!B(MISSING)nE7AoHvNRiI%!F(MISSING)UgNQK4Z9Ol59Cbjm8krAFc4VuChZXecTjl2jff32y5cntrRoHaKX3oEdD990Ytxr9hJ%!B(MISSING)gvyoYZ3kYqjQufW7e7JR9VqtVSvNU8RmI2rEeJ9qR47%!F(MISSING)LwnAc5eFROQDVgNbginIlh1rVA%!D(MISSING)%!D(MISSING)&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20210311T134300Z&X-Amz-SignedHeaders=host&X-Amz-Expires=600&X-Amz-Credential=ASIA25DCYHY34THDJLN6%!F(MISSING)20210311%!F(MISSING)us-east-1%!F(MISSING)s3%!F(MISSING)aws4_request&X-Amz-Signature=8fc34ddca517260ed6f40002bda5deb955cda64d89aa9bbcbd939a222125fb52”,
RepositoryType: “S3”
},
Configuration: {
CodeSha256: “Zwjm8fPRayD4z2iIYJCSO1KDIDtkRxpUG0WshnB+u4I=”,
CodeSize: 269,
DeadLetterConfig: {
TargetArn: “arn:aws:sqs:us-east-1:xxxxxxxx:test-dlq”
},
Description: “”,
Environment: {
Variables: {
Name: “”
}
},
FunctionArn: “arn:aws:lambda:us-east-1:752617210841:function:test”,
FunctionName: “aa88466lambda3380”,
Handler: “index.lambda_handler”,
LastModified: “2021-03-11T13:39:51.574+0000”,
LastUpdateStatus: “Successful”,
Layers: [{
Arn: “arn:aws:lambda:us-east-1:xxxx:layer:tftestlambda:6”,
CodeSize: 497817
}],
MemorySize: 128,
PackageType: “Zip”,
RevisionId: “007d07d8-d12d-4d79-bae6-37d2913c42d3”,
Role: “arn:aws:iam::xxxxxx:role/lambda/test”,
Runtime: “python3.8”,
State: “Active”,
Timeout: 3,
TracingConfig: {
Mode: “PassThrough”
},
Version: “$LATEST”,
VpcConfig: {
SecurityGroupIds: [],
SubnetIds: [],
VpcId: “”
}
},
Tags: {
cartid: “1234”,
appinstid: “1234”,
ctcversionidmw: “n/a”,
sector: “cti”,
ctcversionidos: “n/a”,
csiappid: “1234”,
tenantcsiappid: “1234”,
ctcversioniddb: “n/a”,
ctcversionidplatform: “1234”,
billingprofileid: “1234”,
sectorspecificgoc: “1234”,
environment: “dev”
}
}
我想像读取映射一样读取这个对象,因为它是非结构化的,我不知道如何拆分它。有谁知道如何获取特定的键和值,例如role及其对应的值吗?
更多关于Golang中如何将字符串读取器作为键值对使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Golang中如何将字符串读取器作为键值对使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中处理非结构化JSON数据时,可以使用encoding/json包的json.RawMessage或map[string]interface{}来解析。对于你的需求,将字符串读取器作为键值对使用的最佳方式是解析为map结构。
以下是示例代码:
package main
import (
"encoding/json"
"fmt"
"strings"
)
func main() {
// 你的JSON数据(简化示例)
jsonStr := `{
"Configuration": {
"Role": "arn:aws:iam::xxxxxx:role/lambda/test",
"FunctionName": "aa88466lambda3380"
},
"Tags": {
"environment": "dev"
}
}`
// 将字符串转换为读取器
reader := strings.NewReader(jsonStr)
// 解析为map[string]interface{}
var result map[string]interface{}
decoder := json.NewDecoder(reader)
err := decoder.Decode(&result)
if err != nil {
panic(err)
}
// 获取Configuration中的Role
if config, ok := result["Configuration"].(map[string]interface{}); ok {
if role, ok := config["Role"].(string); ok {
fmt.Printf("Role: %s\n", role)
}
}
// 获取Tags中的environment
if tags, ok := result["Tags"].(map[string]interface{}); ok {
if env, ok := tags["environment"].(string); ok {
fmt.Printf("Environment: %s\n", env)
}
}
// 遍历所有键值对
for key, value := range result {
fmt.Printf("Key: %s, Type: %T\n", key, value)
}
}
如果你需要从AWS Lambda响应中直接解析,可以这样处理:
package main
import (
"encoding/json"
"fmt"
"github.com/aws/aws-sdk-go/service/lambda"
)
func parseLambdaResponse(resp *lambda.GetFunctionOutput) {
// 将整个响应转换为JSON字符串
jsonBytes, _ := json.Marshal(resp)
// 解析为map
var data map[string]interface{}
json.Unmarshal(jsonBytes, &data)
// 访问嵌套的Configuration.Role
if configuration, ok := data["Configuration"].(map[string]interface{}); ok {
if role, ok := configuration["Role"].(string); ok {
fmt.Printf("Lambda Role: %s\n", role)
}
// 获取其他配置项
if functionName, ok := configuration["FunctionName"].(string); ok {
fmt.Printf("Function Name: %s\n", functionName)
}
}
// 访问Tags
if tags, ok := data["Tags"].(map[string]interface{}); ok {
for key, value := range tags {
fmt.Printf("Tag - %s: %v\n", key, value)
}
}
}
对于更复杂的嵌套访问,可以使用递归函数:
func getValue(data interface{}, keys ...string) interface{} {
current := data
for _, key := range keys {
if m, ok := current.(map[string]interface{}); ok {
current = m[key]
} else {
return nil
}
}
return current
}
// 使用示例
func main() {
var data map[string]interface{}
// ... 解析JSON到data ...
// 获取Role
role := getValue(data, "Configuration", "Role")
if role != nil {
fmt.Printf("Role: %v\n", role)
}
// 获取Tags中的environment
env := getValue(data, "Tags", "environment")
if env != nil {
fmt.Printf("Environment: %v\n", env)
}
}
如果你需要处理来自io.Reader的JSON数据流:
package main
import (
"encoding/json"
"fmt"
"io"
)
func parseFromReader(r io.Reader) {
decoder := json.NewDecoder(r)
var data map[string]interface{}
for {
if err := decoder.Decode(&data); err == io.EOF {
break
} else if err != nil {
panic(err)
}
// 处理数据
if config, ok := data["Configuration"].(map[string]interface{}); ok {
fmt.Printf("Function: %v\n", config["FunctionName"])
}
}
}
这些方法允许你将JSON字符串或读取器作为键值对处理,通过类型断言访问嵌套的字段值。

