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.RawMessagemap[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字符串或读取器作为键值对处理,通过类型断言访问嵌套的字段值。

回到顶部