如何在Golang中遍历MongoDB返回的JSON数据提取所有user_id
如何遍历JSON数组提取所有user_id值?
你当前通过json.Marshal(vdata["user"])得到的是包含多个用户对象的JSON数组,要提取其中所有user_id值,可采用以下两种Go语言实现方式:
方式一:使用结构体映射(推荐,类型安全)
先定义与JSON结构匹配的结构体,将JSON数据解析为结构体切片后,遍历切片提取user_id:
package main import ( "encoding/json" "fmt" ) // 仅定义需要的user_id字段,其余字段可忽略 type User struct { UserID string `json:"user_id"` } func main() { // 模拟从MongoDB获取的JSON数据 jsonData := `[ { "avatar_image": "https://i6e.jpg", "display_name": "flash.info", "image_user": "", "user_id": "qXGFIa", "username": "flash.info" }, { "avatar_image": "https://847a", "display_name": "Akhmad Jazuli", "image_user": "", "user_id": "mf7EXj", "username": "akhmad.jazuli" }, { "avatar_image": "https://i-stageb10a.jpg", "display_name": " Alfan Rey", "image_user": "", "user_id": "bsiAlG", "username": "fn.alfan" } ]` var users []User // 解析JSON到结构体切片 if err := json.Unmarshal([]byte(jsonData), &users); err != nil { fmt.Println("解析JSON失败:", err) return } // 遍历输出所有user_id fmt.Println("所有user_id值:") for _, user := range users { fmt.Println(user.UserID) } }
方式二:使用map切片(无需定义结构体,灵活但无类型检查)
若不想定义结构体,可直接将JSON解析为[]map[string]interface{},遍历每个map提取user_id:
package main import ( "encoding/json" "fmt" ) func main() { jsonData := `[ { "avatar_image": "https://i6e.jpg", "display_name": "flash.info", "image_user": "", "user_id": "qXGFIa", "username": "flash.info" }, { "avatar_image": "https://847a", "display_name": "Akhmad Jazuli", "image_user": "", "user_id": "mf7EXj", "username": "akhmad.jazuli" }, { "avatar_image": "https://i-stageb10a.jpg", "display_name": " Alfan Rey", "image_user": "", "user_id": "bsiAlG", "username": "fn.alfan" } ]` var userList []map[string]interface{} if err := json.Unmarshal([]byte(jsonData), &userList); err != nil { fmt.Println("解析JSON失败:", err) return } fmt.Println("所有user_id值:") for _, user := range userList { // 类型断言确保值为字符串类型 if userID, ok := user["user_id"].(string); ok { fmt.Println(userID) } } }
针对现有代码的优化
如果你已经通过vdata["user"]拿到了原始数据,无需先Marshal再处理,可直接将vdata["user"]断言为对应类型(如[]interface{}或结构体切片)后遍历提取,避免不必要的序列化/反序列化操作。
内容的提问来源于stack exchange,提问作者Reski
相关产品推荐
相关产品推荐

