json - 无法使用带有空格的键名解码 JSON

标签 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}]

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

最佳答案

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

关于json - 无法使用带有空格的键名解码 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44629731/

相关文章:

java - 无法通过 Java 迭代和获取字符串

javascript - 前端从后端获取错误数据

go - 为什么互斥锁比 golang 中的 channel 慢?

c - 作为 const 或操作数的正确参数

struct - 如何在Rust中实现一个具有自身作为字段的列表的结构

go - 如何在golang中使用[]struct的对象

arrays - 如何在 Mongoose 中查询 findOne() 以便我们获得满足特定条件的文档数组的子集?

asp.net - JsonResult 相当于 [DataMember(Name ="Test")]

c# - 在哪里可以找到适用于 C# 的简单但灵活的 JSON 解析器?

go - 紧密环路泄漏 Reader