Can';t使用带有空格的键名对JSON进行解组

Can';t使用带有空格的键名对JSON进行解组,json,go,struct,Json,Go,Struct,我得到的一些JSON数据在键名中有空格。我使用标准编码/json库来解组数据。但是,它无法理解模式中带有空格的键。例如,以下代码: package main import ( "encoding/json" "fmt" ) func main() { var jsonBlob = []byte(`[ {"Na me": "Platypus", "Order": "Monotremata"}, {"Na me": "Quoll",

我得到的一些JSON数据在键名中有空格。我使用标准
编码/json
库来解组数据。但是,它无法理解模式中带有空格的键。例如,以下代码:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var jsonBlob = []byte(`[
        {"Na me": "Platypus", "Order": "Monotremata"},
        {"Na me": "Quoll",    "Order": "Dasyuromorphia"}
    ]`)
    type Animal struct {
        Name  string `json: "Na me"`
        Order string `json: "Order,omitempty"`
    }
    var animals []Animal
    err := json.Unmarshal(jsonBlob, &animals)
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Printf("%+v", animals)
}
给出如下输出:

[{Name: Order:Monotremata} {Name: Order:Dasyuromorphia}]
因此,在模式中,库将删除空格(从Name)并尝试查找明显不存在的键(Name)。有什么建议吗?

您的
json
不正确,这就是为什么库默认为字段名,即
name
。但是,由于没有带有
“Name”
键的JSON字段,
Animal.Name
将保持其零值(即空字符串

如果缺少
json
标记规范(尝试使用小写和大写),则对
Order
进行解组仍然有效,因为
json
包将使用字段名。由于字段名与JSON键相同,因此它不需要额外的JSON标记映射

在标记规范中,冒号之后和引号之前不能有空格:

type Animal struct {
    Name  string `json:"Na me"`
    Order string `json:"Order,omitempty"`
}
通过这一简单的更改,它可以正常工作(请在以下网站上试用):


哎哟,问题解决了。谢谢。不过我还是不完全明白。为什么顺序键在这种情况下工作……啊,明白了,这里的顺序键名称与schemaJust相同,以便在错误指定结构(实际上只是标记)的情况下更清楚地说明这一点json和属性名之间有空格,它完全忽略标记规范,因为它在“json:”(无效)后包含空格,并尝试直接映射字段名。因此它只适用于“Order”,而不适用于“Na me”(即使我们将Order标记更改为任何垃圾值,例如将该行更改为:Order string
json:“ABCD,省略Empty”
它仍然可以工作)
[{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]