You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go语言中从包含数组的JSON结构中提取boots字段的值

问题原因

你现有代码无输出的核心逻辑问题是:test函数仅对切片类型做了分支处理,但你传入的res是JSON反序列化得到的map[string]interface{}类型,类型判断不匹配,没有对应执行逻辑,所以没有输出。

方案1:预定义结构体反序列化(最推荐)

Go处理JSON优先推荐用结构体映射结构,类型安全无需额外反射判断,代码如下:

package main

import (
	"encoding/json"
	"fmt"
)

// 定义和JSON结构匹配的结构体
type Response struct {
	Identifier string `json:"identifier"`
	Name       string `json:"name"`
	Person     Person `json:"person"`
}

type Person struct {
	Items     interface{}     `json:"items"`
	Inventory []InventoryItem `json:"inventory"`
	Pockets   interface{}     `json:"Pockets"`
}

type InventoryItem struct {
	TShirt   string   `json:"T-shirt"`
	Backpack Backpack `json:"Backpack"`
}

type Backpack struct {
	BigPocket BigPocket `json:"BigPocket"`
}

type BigPocket struct {
	Spell   string `json:"spell"`
	Boots   string `json:"boots"`
	Shampoo string `json:"shampoo"`
}

func main() {
	varjson := `{
		"identifier": "1",
		"name": "dumbname",
		"person": {
			"items": null,
			"inventory": [
				{
					"T-shirt": "black",
					"Backpack": {
						"BigPocket": {
							"spell": "healing",
							"boots": "speed",
							"shampoo": "Head & Shoulders"
						}
					}
				}
			],
			"Pockets": null
		}
	}`

	var res Response
	err := json.Unmarshal([]byte(varjson), &res)
	if err != nil {
		fmt.Println("反序列化失败:", err)
		return
	}
	// 直接提取boots字段
	boots := res.Person.Inventory[0].Backpack.BigPocket.Boots
	fmt.Println("boots的值为:", boots)
}

运行后输出:boots的值为: speed

方案2:逐层类型断言(无需定义结构体)

如果不想定义大量结构体,可以对反序列化后的map[string]interface{}逐层做类型断言提取:

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	varjson := `{
		"identifier": "1",
		"name": "dumbname",
		"person": {
			"items": null,
			"inventory": [
				{
					"T-shirt": "black",
					"Backpack": {
						"BigPocket": {
							"spell": "healing",
							"boots": "speed",
							"shampoo": "Head & Shoulders"
						}
					}
				}
			],
			"Pockets": null
		}
	}`

	var res map[string]interface{}
	err := json.Unmarshal([]byte(varjson), &res)
	if err != nil {
		fmt.Println("反序列化失败:", err)
		return
	}
	// 逐层断言提取
	person := res["person"].(map[string]interface{})
	inventory := person["inventory"].([]interface{})
	firstItem := inventory[0].(map[string]interface{})
	backpack := firstItem["Backpack"].(map[string]interface{})
	bigPocket := backpack["BigPocket"].(map[string]interface{})
	boots := bigPocket["boots"].(string)
	fmt.Println("boots的值为:", boots)
}

内容的提问来源于stack exchange,提问作者NexDanger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:39:04