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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:20:45