【问题标题】:Can't unmarshall JSON with key names having spaces无法使用带有空格的键名解组 JSON
【发布时间】:2017-06-19 11:47:12
【问题描述】:

我得到的一些 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}]

因此,在架构中,库删除了空格(来自 Name)并尝试找到显然不存在的键(Name)。有什么建议我可以在这里做什么?

【问题讨论】:

    标签: json go struct


    【解决方案1】:

    您的 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}]
    

    【讨论】:

    • 哎呀,解决了。谢谢。不过还是没完全明白。为什么在这种情况下订单键有效...
    • 嗯明白了,这里的order key name和schema一样
    • 为了让这一点更清楚,如果错误指定的结构(实际上只是标签)在 json 和属性名称之间有空格,它完全忽略标签规范,因为它在“json”之后包含一个空格:" (无效) & 尝试直接映射字段名称。所以它只适用于“订单”而不是“名字”(即使我们将订单标签更改为任何垃圾值,例如将该行更改为:订单字符串json: "ABCD,omitempty" 它仍然有效)
    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 2020-05-07
    相关资源
    最近更新 更多