Go 混合大小写JSON键don';t按预期封送,返回错误

Go 混合大小写JSON键don';t按预期封送,返回错误,go,Go,下面的代码生成此错误json:无法将数字解组到Go-struct字段TMP.a中,类型为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"` }

下面的代码生成此错误json:无法将数字解组到Go-struct字段TMP.a中,类型为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)
    }
}
我通读了一遍,找不到任何说明这不应该起作用的东西。我错过了什么


有人要求我澄清,这是正确的。我真正想知道的是,为什么当我只使用两个大小写不同的键的JSON时,Unmarshal没有保留我在struct JSON标记中提供的大小写。

首先更改字段的名称。因为它们只有大写字母A和小写字母A。因此,当go尝试封送字段时,它无法识别字段之间的差异

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:无法将字符串解组到int类型的Go struct字段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

然而,有一点可笑的是,只有一个字段忽略了该案例。将结构更改为:

类型TMP结构{
//接口{}
json:“A”

字符串
json:“A”

B int
json:“A”

}


也行。

没有道理,阿德里安。JSON字段
a
是一个字符串。它试图将字段
A
解组到字符串中,文档明确指出,如果标记并匹配,则只会使用准确的字段名
Unmarshal将传入的对象键与封送所使用的键(结构字段名或其标记)匹配,更喜欢精确匹配,但也接受不区分大小写的匹配。
老实说,这感觉像是一个bug。我误解了这个问题。这是一个不幸的边缘情况,
encoding/json
没有很好地处理,它实际上不区分大小写。为此,您可能需要在您的问题中澄清这一问题是因为JSON中有两个键,它们只是大小写不同;这一点在阅读时并不是很清楚。事实上,这似乎已经有一个悬而未决的问题:我应该更好地澄清这个问题,谢谢大家在这方面的帮助。看来这是一个错误,或者说是goteam考虑改变这一点,而不是他所要求的。他说,如果两个JSON字段仅因大小写不同而不同,那么指定一个具有精确大小写匹配的字段并不能与正在解组的JSON进行区分大小写的匹配。这实际上与包的文档不匹配。这是JSON方面的良好实践吗?几乎可以肯定不是(JSON一开始就被认为是区分大小写的吗?)。但它确实违反了文档的文本。他感到困惑,他问为什么在go文档中没有提到。如果有人读了这个问题,他将无法认识到这一点。抱歉@Kaedys。这个问题并非如此。因为这是一个基于观点的问题,不是真正基于观点的。他在问为什么文件中明确指出不应该这样做,而软件包却会这样做。这不是一个bug,就是文档需要澄清。这不属于意见问题的范畴。它不是基于意见的,文档与观察到的行为不匹配。这真是一个奇迹。虽然规范没有指定JSON对象键是否区分大小写,但我能找到的所有其他东西似乎都暗示它在大多数实现中区分大小写。@Adrian你在哪里找到了类似的实现,你说
,但我能找到的所有东西似乎都暗示它在大多数实现中区分大小写。说真的,我也像你一样,对第一个问题感到困惑:)叹气。他试图解组字符串“str”
。它被标记为在struct def中使用小写的
a