如何在Golang中为非本地类型解码类型从字符串转换为整数的JSON?

时间:2018-03-04 16:08:28

标签: json amazon-web-services go unmarshalling

以下是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&然后将其转换为整数并生成原始结构的对象。

通过在项目文件夹中进行一些更改并对所有此类参数进行验证,我需要更多时间来维护完整的副本。

我有以下问题。

  1. 有没有办法在取消编译时将字符串转换为整数而不在整数字段中添加类似(json:",string")的json标记。
  2. 保持结构的精确副本(elbv2包的结构)几乎没有变化是一个好习惯吗?

3 个答案:

答案 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"`
}

来自:https://golang.org/pkg/encoding/json

答案 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"
}

参考: https://play.golang.org/p/3q4-CGnmNyE

答案 2 :(得分:-1)

当将json字节解组为struct时,我们可以定义任何名称是小写还是大写。但是,当将结构编组为json时,我们无法定义它。因为它不会转换小写字段: discord.Member它不会取json的值,因为name应该是大写的,因为它可以导出。在Go playground

上查看此代码