如何将映射从 DynamoDB 解组到结构?
how to unmarshal a map from DynamoDB to struct?
dynamo上有如下字段
{
"config": {
"BASE_AUTH_URL_KEY": "https://auth.blab.bob.com",
"BASE_URL": "https://api.dummy.data.com",
"CONN_TIME_OUT_SECONDS": "300000",
"READ_TIME_OUT_SECONDS": "300000"
},
"id": "myConfig"
}</pre>
and getting the element with dynamodbattribute
import(
"github.com/aws/aws-sdk-go/service/dynamodb"
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute")
result, err := svc.GetItem(&dynamodb.GetItemInput{
TableName: aws.String(tableName),
Key: map[string]*dynamodb.AttributeValue{
"id": {
S: aws.String(configId),
},
},
})
这段代码可以正常工作,但是当我尝试检索它呈现的对象时
map[config:{
M: {
BASE_AUTH_URL_KEY: {
S: "https://auth.blab.bob.com"
},
CONN_TIME_OUT_SECONDS: {
S: "300000"
},
READ_TIME_OUT_SECONDS: {
S: "300000"
},
BASE_URL: {
S: "https://api.dummy.data.com"
}
}
} id:{
S: "myConfig"
}]
出于这个原因,当我尝试解组我的对象时,对象解组 returns 作为 {}
type Config struct {
id string
baseAuthUrlKey string
baseUrl string
connectTimeOutSecs string
readTimeOutSecs string
}
item := Config{}
err = dynamodbattribute.UnmarshalMap(result.Item, &item)
如何从 GetItem 中分配值 return,它似乎是我的结构的映射?
问题的根源在于您的 Config
结构的结构不正确。
我建议在将 JSON 转换为 Go 结构时使用 json-to-go;此工具将帮助您在将来发现此类问题。
一旦你正确构建了你的结构,你还会注意到你的结构字段没有大写,这意味着它们不会被导出(即不能被其他包使用),这是你的另一个原因UnmarshalMap
代码不会 return 您期望的结果。
Here 是关于结构字段可见性及其重要性的一个很好的答案,上面已进行了简要总结。
下面是你的结构的一个更正版本,结合你的 UnmarshalMap
代码,将正确地允许你打印你的 item
而不会收到一个 {}
这一点也不好玩.
type Item struct {
Config struct {
BaseAuthUrlKey string `json:"BASE_AUTH_URL_KEY"`
BaseUrl string `json:"BASE_URL"`
ConnTimeoutSeconds string `json:"CONN_TIME_OUT_SECONDS"`
ReadTimeoutSeconds string `json:"READ_TIME_OUT_SECONDS"`
} `json:"config"`
ID string `json:"id"`
}
dynamo上有如下字段
{ "config": { "BASE_AUTH_URL_KEY": "https://auth.blab.bob.com", "BASE_URL": "https://api.dummy.data.com", "CONN_TIME_OUT_SECONDS": "300000", "READ_TIME_OUT_SECONDS": "300000" }, "id": "myConfig" }</pre>
and getting the element with dynamodbattribute import( "github.com/aws/aws-sdk-go/service/dynamodb" "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute") result, err := svc.GetItem(&dynamodb.GetItemInput{ TableName: aws.String(tableName), Key: map[string]*dynamodb.AttributeValue{ "id": { S: aws.String(configId), }, }, })
这段代码可以正常工作,但是当我尝试检索它呈现的对象时
map[config:{ M: { BASE_AUTH_URL_KEY: { S: "https://auth.blab.bob.com" }, CONN_TIME_OUT_SECONDS: { S: "300000" }, READ_TIME_OUT_SECONDS: { S: "300000" }, BASE_URL: { S: "https://api.dummy.data.com" } } } id:{ S: "myConfig" }]
出于这个原因,当我尝试解组我的对象时,对象解组 returns 作为 {}
type Config struct { id string baseAuthUrlKey string baseUrl string connectTimeOutSecs string readTimeOutSecs string } item := Config{} err = dynamodbattribute.UnmarshalMap(result.Item, &item)
如何从 GetItem 中分配值 return,它似乎是我的结构的映射?
问题的根源在于您的 Config
结构的结构不正确。
我建议在将 JSON 转换为 Go 结构时使用 json-to-go;此工具将帮助您在将来发现此类问题。
一旦你正确构建了你的结构,你还会注意到你的结构字段没有大写,这意味着它们不会被导出(即不能被其他包使用),这是你的另一个原因UnmarshalMap
代码不会 return 您期望的结果。
Here 是关于结构字段可见性及其重要性的一个很好的答案,上面已进行了简要总结。
下面是你的结构的一个更正版本,结合你的 UnmarshalMap
代码,将正确地允许你打印你的 item
而不会收到一个 {}
这一点也不好玩.
type Item struct {
Config struct {
BaseAuthUrlKey string `json:"BASE_AUTH_URL_KEY"`
BaseUrl string `json:"BASE_URL"`
ConnTimeoutSeconds string `json:"CONN_TIME_OUT_SECONDS"`
ReadTimeoutSeconds string `json:"READ_TIME_OUT_SECONDS"`
} `json:"config"`
ID string `json:"id"`
}