我正在动态获取一个字符串作为输入,我需要访问某些字段,所以我试图将其解析为 JSON,但我的代码不起作用。
我需要能够获取某些字段的值,例如 input['school_id'] 并且需要将 input['school_details'] 的值转换为 map[string] 字符串。这是我试过的:
func main() {
input := `{"school_capacity":2000,"school_id":"10","school_details":{"classes":"8","subjects":"5","teachers":"15"}}`
var raw map[string]string
json.Unmarshal([]byte(input), &raw)
print(raw["input"])
}
然而,这行不通。为什么?
答案 0 :(得分:1)
您正在将字符串映射解组为字符串。您的数据有一个整数字段、一个字符串字段和一个结构字段。因此,如果任何数据解析失败,您将得到一个空字符串。此外,没有您要访问的“输入”字段。
对具有固定结构的数据进行编组和解组的最佳方法之一是使用结构标记:
type response struct {
Page int `json:"page"`
Fruits []string `json:"fruits"`
}
但是你也可以使用映射来清空界面:
var dat map[string]interface{}
答案 1 :(得分:1)
input := `{"school_capacity":2000,"school_id":"10","school_details":{"classes":"8","subjects":"5","teachers":"15"}}`
var raw map[string]interface{}
json.Unmarshal([]byte(input), &raw)
fmt.Printf("%v", raw)
答案 2 :(得分:0)
您应该使用 map[string]interface{}
来存储您的 JSON 对象。 map[string]string
不会处理数字、布尔值或嵌套对象的元素。
完成后,您可以查看地图的元素:
fmt.Print(raw["school_details"])
并且您可以使用类型断言将嵌套对象拉出,有效地将嵌套对象转换为 map[string]interface{}
:
if schoolDetails, ok := raw["school_details"].(map[string]interface{}); ok {
fmt.Printf("%v\n", schoolDetails["classes"])
}
处理任意 JSON 对象有点麻烦,因此您需要小心谨慎以确保结构符合您的预期。
答案 3 :(得分:0)
那行得通:https://repl.it/@ruoyanss/jsonParse
package main
import (
"fmt"
"encoding/json"
)
func main() {
str := `{"school_capacity":2000,"school_id":"10","school_details":{"classes":"8","subjects":"5","teachers":"15"}}`
var raw map[string]interface{}
json.Unmarshal([]byte(str), &raw)
fmt.Println(raw["school_capacity"])
}