如何在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
相关产品推荐
相关产品推荐

