从 Json 中的数组中提取值
Extract value from an array in a Json
我正在尝试获取“靴子”值
我的主函数
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{}
json.Unmarshal([]byte(varjson), &res)
test(res)
测试函数
func test(t interface{}) {
switch reflect.TypeOf(t).Kind() {
case reflect.Slice:
s := reflect.ValueOf(t)
for i := 0; i < s.Len(); i++ {
fmt.Println(s.Index(i))
}
}
}
但是当我编译时我什么也得不到
如果有另一种方法来获取 Json 中的“启动”值?
假设你可以使用类型,根据你的评论(谢天谢地,因为完全同意 colm,试图反映结构是粗糙的。
一旦你有了一个类型,它就非常容易导航。
特别是fmt.Println(res.Person.Inventory[0].Backpack.BigPocket.Boots)
会给你带来靴子的价值。请记住,Inventory 是一个切片,因此您可能需要对其进行迭代,而这里我直接访问它,如果 Inventory 为空或有其他元素,这将很糟糕。
package main
import (
"encoding/json"
"fmt"
)
type AutoGenerated struct {
Identifier string `json:"identifier"`
Name string `json:"name"`
Person struct {
Items interface{} `json:"items"`
Inventory []struct {
TShirt string `json:"T-shirt"`
Backpack struct {
BigPocket struct {
Spell string `json:"spell"`
Boots string `json:"boots"`
Shampoo string `json:"shampoo"`
} `json:"BigPocket"`
} `json:"Backpack"`
} `json:"inventory"`
Pockets interface{} `json:"Pockets"`
} `json:"person"`
}
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 AutoGenerated
json.Unmarshal([]byte(varjson), &res)
fmt.Println(res.Person.Inventory[0].Backpack.BigPocket.Boots)
}
在你原来的情况下,错误的是你的 switch 语句只覆盖了一个切片,但初始对象是一个映射。所以你的交换机最初没有找到匹配项
我正在尝试获取“靴子”值
我的主函数
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{}
json.Unmarshal([]byte(varjson), &res)
test(res)
测试函数
func test(t interface{}) {
switch reflect.TypeOf(t).Kind() {
case reflect.Slice:
s := reflect.ValueOf(t)
for i := 0; i < s.Len(); i++ {
fmt.Println(s.Index(i))
}
}
}
但是当我编译时我什么也得不到 如果有另一种方法来获取 Json 中的“启动”值?
假设你可以使用类型,根据你的评论(谢天谢地,因为完全同意 colm,试图反映结构是粗糙的。
一旦你有了一个类型,它就非常容易导航。
特别是fmt.Println(res.Person.Inventory[0].Backpack.BigPocket.Boots)
会给你带来靴子的价值。请记住,Inventory 是一个切片,因此您可能需要对其进行迭代,而这里我直接访问它,如果 Inventory 为空或有其他元素,这将很糟糕。
package main
import (
"encoding/json"
"fmt"
)
type AutoGenerated struct {
Identifier string `json:"identifier"`
Name string `json:"name"`
Person struct {
Items interface{} `json:"items"`
Inventory []struct {
TShirt string `json:"T-shirt"`
Backpack struct {
BigPocket struct {
Spell string `json:"spell"`
Boots string `json:"boots"`
Shampoo string `json:"shampoo"`
} `json:"BigPocket"`
} `json:"Backpack"`
} `json:"inventory"`
Pockets interface{} `json:"Pockets"`
} `json:"person"`
}
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 AutoGenerated
json.Unmarshal([]byte(varjson), &res)
fmt.Println(res.Person.Inventory[0].Backpack.BigPocket.Boots)
}
在你原来的情况下,错误的是你的 switch 语句只覆盖了一个切片,但初始对象是一个映射。所以你的交换机最初没有找到匹配项