混合大小写 JSON 键未按预期封送,返回错误



下面的代码生成此错误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" }

也有效。

最新更新