本文介绍如何在 go 语言中安全、高效地遍历由 json 解析生成的嵌套 `map[string]interface{}` 结构,特别是从中批量提取每个对象的 `"dn"` 字段值。
在 Go 中处理动态 JSON 数据时,常使用 map[string]interface{} 作为通用解码目标。但其嵌套类型断言(type assertion)容易出错,需谨慎处理类型层级。以你的场景为例:data_json["data"] 是一个 JSON 数组,解码后为 []interface{};数组中每个元素又是一个对象,对应 map[string]interface{} 类型。要提取所有 "dn" 值,关键在于正确展开数组并逐项断言为映射类型。
以下是一个健壮的遍历函数示例,已加入基础错误防护:
func printAllDataDn(data_json map[string]interface{}) {
// 检查顶层是否存在 "data" 键
if data, ok := data_json["data"]; ok {
// 断言为切片类型
if objects, ok := data.([]interface{}); ok {
for i, v := range objects {
// 断言每个元素为 map[string]interface{}
if item, ok := v.(map[string]interface{}); ok {
if dn, exists := item["dn"]; exists {
fmt.Printf("Item[%d].dn = %v\n", i, dn)
} else {
fmt.Printf("Item[%d]: missing 'dn' field\n", i)
}
} else {
fmt.Printf("Item[%d]: expected map[string]interface{}, got %T\n", i, v)
}
}
} else {
fmt.Println("Error: 'data' is not a JSON array")
}
} else {
fmt.Println("Error: 'data' key not found in JSON")
}
}⚠️ 注意事项:
综上,核心逻辑是「数组 → 遍历 → 逐项转 map → 取键值」,辅以类型检查即可安全完成批量提取。