无法使用包含空格的键名解组JSON

时间:2017-06-19 11:47:12

标签: json go struct

我得到的一些JSON数据在键名中有空格。我正在使用标准encoding/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}]

因此,在架构中,库会删除空间(来自 Na me )并尝试找到密钥(名称),这显然不存在。有什么建议我可以在这做什么?

1 个答案:

答案 0 :(得分:6)

json tag specification不正确,这就是encoding/json库默认使用Name字段名称的原因。但由于没有带"Name"键的JSON字段,Animal.Name将保持其零值(即空字符串"")。

解组Order仍然有效,因为如果缺少json标记规范,json包将使用字段名称(尝试使用小写和大写)。由于字段名称与JSON密钥相同,因此无需额外的JSON标记映射即可运行。

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

type Animal struct {
    Name  string `json:"Na me"`
    Order string `json:"Order,omitempty"`
}

通过这个简单的更改,它可以正常工作(在Go Playground)上尝试:

[{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]