如果在json的结构体中指定为接口,数字会转换成什么类型

问题描述 投票:0回答:1

我有一个 json,其中字段可以作为字符串和数字。

{"ID": 123456}
{"ID": "12345678"}

我需要处理这两个选项。我是通过接口写的,并将类型输出到日志中。我的 ID 始终是整数。解组后 id 是否始终为 float64 还是可以有不同的类型?然后我需要将任何选项添加到字符串中

package main

import (
    "fmt"

    "github.com/pquerna/ffjson/ffjson"
)

type Person struct {
    ID interface{}
}

func main() {
    var message = "{\"ID\": 123456}"
    var message1 = "{\"ID\": \"1234\"}"
    var person, person1 Person
    ffjson.Unmarshal([]byte(message), &person)
    ffjson.Unmarshal([]byte(message1), &person1)
    fmt.Printf("type=%T, value=%v\n ", person.ID, person)
    fmt.Printf("type=%T, value=%v\n ", person1.ID, person1)
}

https://go.dev/play/p/zgSv01-eiCN

json go unmarshalling
1个回答
0
投票

使用

ffjson
有什么具体原因吗?看起来从2019年以来就没有再碰过了。

我建议使用标准库的

encoding/json
,如下例所示。 对于数字你总会得到
float64

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    ID interface{}
}

func main() {
    var message = "{\"ID\": 123456}"
    var message1 = "{\"ID\": \"1234\"}"
    var person, person1 Person
    json.Unmarshal([]byte(message), &person)
    json.Unmarshal([]byte(message1), &person1)
    fmt.Printf("type=%T, value=%v\n", person.ID, person)
    fmt.Printf("type=%T, value=%v\n ", person1.ID, person1)
}

输出:

type=float64, value={123456}
type=string, value={1234}
© www.soinside.com 2019 - 2024. All rights reserved.