
在 go 中解析包含混合类型(如数字与对象)的 json 数组时,需使用 interface{} 或自定义 unmarshaljson 方法,避免类型断言错误并确保结构灵活性。
在 go 中解析包含混合类型(如数字与对象)的 json 数组时,需使用 interface{} 或自定义 unmarshaljson 方法,避免类型断言错误并确保结构灵活性。
Go 的 json.Unmarshal 要求结构体字段类型与 JSON 数据严格匹配。而你提供的 JSON 中,"response" 字段是一个异构数组:首元素为整数(1702487),后续元素为用户对象。这种结构无法直接映射到单一 Go 结构体类型,因此必须采用灵活策略。
最直接且安全的方式是将 response 声明为 []interface{},再按索引和类型进行手动解析:
package main
import (
"encoding/json"
"fmt"
"log"
)
type JsObject struct {
Response []interface{} `json:"response"`
}
type User struct {
UID int `json:"uid"`
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
}
func main() {
data := `{
"response": [1702487, {
"uid": 150261846,
"first_name": "Олег",
"last_name": "Брейн"
}, {
"uid": 53260546,
"first_name": "Олег",
"last_name": "Лобацевич"
}]
}`
var jso JsObject
if err := json.Unmarshal([]byte(data), &jso); err != nil {
log.Fatal("JSON 解析失败:", err)
}
// 安全提取 count(第一个元素)
if len(jso.Response) == 0 {
log.Fatal("response 数组为空")
}
count, ok := jso.Response[0].(float64) // JSON 数字默认解析为 float64
if !ok {
log.Fatal("首个元素不是数字")
}
fmt.Printf("总数量: %d\n", int(count))
// 解析后续用户对象
var users []User
for i := 1; i <p>⚠️ 注意事项:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8483" title="dmap-jsapi-skill"><img
src="https://img.php.cn/upload/skill/000/000/081/179206214475645.jpg" alt="dmap-jsapi-skill" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill8483" title="dmap-jsapi-skill" class="overflowclass">dmap-jsapi-skill</a>
<p class="overflowclass">DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。</p>
</div>
<a rel="nofollow" href="/xiazai/skill8483" title="dmap-jsapi-skill" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
- JSON 中的数字(如
1702487)在 Go 的interface{}中默认为float64,需显式转换为int; - 类型断言务必配合
ok判断,避免 panic; - 若需更高安全性与可维护性,可为
JsObject实现自定义UnmarshalJSON方法,封装类型判断逻辑; - 此类异构 JSON 通常源于遗留 API(如旧版 VK API),建议在业务层尽早转换为强类型结构,避免 throughout 代码中重复类型检查。
总结:面对无命名键、混合类型的 JSON 数组,[]interface{} 是标准起点;结合类型断言与防御性编程,即可稳健完成反序列化。










