下面的代码生成此错误json: cannot unmarshal number into Go struct field TMP.a of type string
package main
import (
"encoding/json"
"fmt"
)
var b = []byte(`{"a": "str", "A": 123}`)
type TMP struct {
// A interface{} `json:"a"`
A string `json:"a"`
// A int `json:"A"`
}
func main() {
var tmp TMP
err := json.Unmarshal(b, &tmp)
if err != nil {
fmt.Println(err)
}
}
我已经通读了 https://golang.org/pkg/encoding/json/#Marshal,找不到任何说明这不应该起作用的内容。我错过了什么?
有人要求我澄清,这是正确的。我真正想知道的是,为什么当我使用只有 2 个大写/小写不同的键的 JSON 时,为什么 Unmarshal 没有保留我在结构 json 标签中提供的大小写。
首先更改字段的名称。由于它们只有大写 A 和小写 a 具有相同的名称。因此,当去尝试编组字段时,它无法在字段之间识别。
package main
import (
"encoding/json"
"fmt"
)
var b = []byte(`{"a": "str", "B": 123}`)
type TMP struct {
// A interface{} `json:"a"`
A string `json:"A"`
B int `json:"B"`
}
func main() {
var tmp TMP
err := json.Unmarshal(b, &tmp)
if err != nil {
fmt.Println(err)
}
fmt.Println(tmp)
}
正如错误所说
json:无法将字符串解编到 Go 结构字段 TMP 中。整数类型的 A
即使您尝试传递如下所示的两个字段,它也会产生相同的错误
var b = []byte(`{"a": "str", "A": 123}`)
type TMP struct {
// A interface{} `json:"a"`
a string `json:"a"`
A int `json:"A"`
}
真正的问题是你试图将 int 取消封送到字符串字段。即使您删除"a": "str"
也会发生错误,并且如果您双引号123
有趣的是,只有一个字段忽略了这种情况。将结构更改为:
type TMP struct {
// A interface{}
json:"a"
A string
json:"a"
B int
json:"A"
}
也有效。