以下是aws go sdk elbv2包中的实际结构类型。 此结构中还有其他参数。为简单起见,我只保留了必要的内容。
type CreateTargetGroupInput struct {
_ struct{} `type:"structure"`
Name *string `type:"string" required:"true"`
Port *int64 `min:"1" type:"integer" required:"true"`
Protocol *string `type:"string" required:"true" enum:"ProtocolEnum"`
VpcId *string `type:"string" required:"true"`
}
我需要使用整数来解码JSON字符串,如:
{ "name": "test-tg", "port": "8080", "protocol": "HTTP" ,"vpcId": "vpc-xxxxxx"}
去代码:
func main() {
s := `{ "name": "test-tg", "port": "8080", "protocol": "HTTP" ,"vpcId": "vpc-xxxxxx"}`
targetGroupInput := &elbv2.CreateTargetGroupInput{}
err := json.Unmarshal([]byte(s), targetGroupInput)
if err == nil {
fmt.Printf("%+v\n", targetGroupInput)
}
}
我得到以下输出,(如果我以整数格式传递端口,它将会工作)
{
Name: "testTG",
Port: 0,
Protocol: "HTTP",
VpcId: "vpc-0f2c8a76"
}
我的问题是原始结构中没有json字段,所以无论我作为json字段传递的有效名称,它仍然是mapping to field。 即我可以将姓名字段发送为
"name, Name, NamE, etc"
在json中它仍然有效。
我在这里感到很困惑。对于其他用户定义的结构,如果我没有提供针对该go字段定义的有效json名称,它将无法正确映射。
另外如何在Json Unmarshlling期间将字符串从字符串转换为整数?
截至目前,我已在项目中使用结构的精确副本,并将字符串类型删除为整数,用于所有整数类型字段(还删除了所有结构字段中的所有指针)并接收json对象和I&然后将其转换为整数并生成原始结构的对象。
通过在项目文件夹中进行一些更改并对所有此类参数进行验证,我需要更多时间来维护完整的副本。
我有以下问题。
json:",string"
)的json标记。答案 0 :(得分:3)
要从字符串转换为int64,只需告诉Go它的字符串编码为int64。
type CreateTargetGroupInput struct {
_ struct{} `type:"structure"`
Name *string `type:"string" required:"true"`
Port *int64 `json:",string"`
Protocol *string `type:"string" required:"true" enum:"ProtocolEnum"`
VpcId *string `type:"string" required:"true"`
}
答案 1 :(得分:0)
您可以使用json.Number
数据类型将字符串转换为整数值。
结构
type CreateTargetGroupInput struct {
_ struct{} `type:"structure"`
Name string `type:"string" required:"true"`
Port json.Number `min:"1" type:"integer" required:"true"`
Protocol string `type:"string" required:"true" enum:"ProtocolEnum"`
VpcId string `type:"string" required:"true"`
}
执行代码
func main() {
s := `{ "name": "test-tg", "port": "8080", "protocol": "HTTP" ,"vpcId": "vpc-xxxxxx"}`
var targetGroupInput CreateTargetGroupInput
err := json.Unmarshal([]byte(s), &targetGroupInput)
if err == nil {
fmt.Printf("%+v\n", targetGroupInput)
}
}
输出
{
"Name": "test-tg",
"Port": 8080,
"Protocol": "HTTP",
"VpcId": "vpc-xxxxxx"
}
答案 2 :(得分:-1)
当将json字节解组为struct时,我们可以定义任何名称是小写还是大写。但是,当将结构编组为json时,我们无法定义它。因为它不会转换小写字段: discord.Member
它不会取json的值,因为name
应该是大写的,因为它可以导出。在Go playground