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

Golang中如何获取JSON数组内嵌对象的from字段?

解决Golang解析JSON获取"from"字段的报错问题及json-iterator使用指南

这个报错的核心原因是你试图直接对interface{}类型的值做索引操作——Go语言不允许直接对interface{}进行索引,必须先将它断言为具体的类型(比如map[string]interface{})才行。下面给你几个可行的解决办法,包括标准库的正确用法和json-iterator的使用方式:

方案1:修正类型断言逻辑

你需要先把testvar.Cd[0][6]断言为map[string]interface{}类型,之后再获取"from"字段,同时建议加入断言失败的错误检查,避免程序panic:

package main

import (
    "encoding/json"
    "fmt"
)

type test struct {
    Ab int             `json:"ab"`
    Cd [][]interface{} `json:"cd"`
}

func main() {
    Data := []byte(`{ "ab": 123456789, "cd": [ [ 4, 1234, 123456, 1000000001, 1234567890, "text", { "from": "123456" } ], [ 4, 4321, 654321, 1000000001, 9876543210, "text", { "from": "654321" } ] ] }`)
    
    var testvar test
    err := json.Unmarshal(Data, &testvar)
    if err != nil {
        panic(err)
    }

    // 第一步:将interface{}断言为map[string]interface{},并检查断言结果
    fromMap, ok := testvar.Cd[0][6].(map[string]interface{})
    if !ok {
        fmt.Println("无法将元素转换为map类型")
        return
    }

    // 第二步:获取"from"字段并断言为string类型
    fromValue, ok := fromMap["from"].(string)
    if !ok {
        fmt.Println("from字段不是string类型")
        return
    }

    fmt.Println(fromValue) // 输出:123456
}

方案2:定义精准嵌套结构体(推荐)

使用interface{}虽然灵活,但类型不安全且代码可读性差。更推荐根据JSON结构定义对应的嵌套结构体,解析后可以直接访问"from"字段:

package main

import (
    "encoding/json"
    "fmt"
)

// 定义存储from字段的结构体
type FromInfo struct {
    From string `json:"from"`
}

// 定义Cd数组中每个元素的结构体(按JSON顺序匹配字段)
type CdItem struct {
    _      int    `json:"-"` // 忽略不需要的第1个字段
    _      int    `json:"-"` // 忽略不需要的第2个字段
    _      int    `json:"-"` // 忽略不需要的第3个字段
    _      int    `json:"-"` // 忽略不需要的第4个字段
    _      int64  `json:"-"` // 第5个字段值超出int范围,用int64存储
    _      string `json:"-"` // 忽略不需要的第6个字段
    From   FromInfo          // 第7个字段是FromInfo结构体
}

// 顶层结构体
type Test struct {
    Ab int      `json:"ab"`
    Cd []CdItem `json:"cd"`
}

func main() {
    Data := []byte(`{ "ab": 123456789, "cd": [ [ 4, 1234, 123456, 1000000001, 1234567890, "text", { "from": "123456" } ], [ 4, 4321, 654321, 1000000001, 9876543210, "text", { "from": "654321" } ] ] }`)
    
    var testvar Test
    err := json.Unmarshal(Data, &testvar)
    if err != nil {
        panic(err)
    }

    // 直接访问from字段,类型安全且无需断言
    fmt.Println(testvar.Cd[0].From.From) // 输出:123456
    fmt.Println(testvar.Cd[1].From.From) // 输出:654321
}

json-iterator的使用方法

json-iterator是一个高性能的JSON解析库,它的API与标准库encoding/json完全兼容,你可以直接替换使用,无需修改现有逻辑:

  1. 先安装json-iterator:
go get github.com/json-iterator/go
  1. 在代码中导入并替换标准库的调用:
    以方案1为例,只需要将导入和Unmarshal部分修改为:
import jsoniter "github.com/json-iterator/go"

// ...

var testvar test
err := jsoniter.Unmarshal(Data, &testvar)
if err != nil {
    panic(err)
}

其余代码逻辑完全不变,它会提供比标准库更好的解析性能,尤其是处理大型JSON数据时优势明显。

内容的提问来源于stack exchange,提问作者Danil Dumkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:27:33