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

Golang中如何解析scanner.Text()返回的JSON字符串?

问题排查与解决

问题原因

  • 结构体定义与JSON结构不匹配:你的JSON中data字段是数组类型,但定义的JD结构体中Data字段为单个JData结构体,类型不匹配导致解析后字段无值。
  • 逐行读取逻辑不适配多行文JSON:你示例的JSON对象为多行格式化结构,scanner.Scan()逐行读取只能拿到单个JSON片段,无法得到完整可解析的JSON对象。
  • jobData[0]输出123是正常现象:Go语言中字符串下标访问返回对应字节的ASCII值,字符{的ASCII码就是123,符合你读取到JSON首行的输出结果。
  • Scanner未绑定输入流:你拿到云存储的Readerrc后没有初始化scanner、未将rc作为输入源绑定到scanner,读取到的内容不是目标云存储文件的内容。

修复方案

直接使用json.Decoder从输入流中批量读取多个JSON对象,无需手动处理行拆分,同时修正结构体定义即可:

// 修正后的结构体定义
type JA struct {
    Title       string `json:"title"`
    Url         string `json:"url"`
    Description string `json:"description"`
}

type JData struct {
    Id         string `json:"id"`
    Type       string `json:"type"` // 如不需要该字段可删除
    Attributes JA     `json:"attributes"`
}

type JD struct {
    Data []JData `json:"data"` // 改为数组类型和JSON结构匹配
}

// 读取解析逻辑
rc, err := client.Bucket(bucket).Object(object).NewReader(ctx)
if err != nil {
    // 自行替换为你的错误处理逻辑
    panic(err)
}
defer rc.Close()

// 直接用json.Decoder读取流
decoder := json.NewDecoder(rc)
for decoder.More() {
    var job JD
    if err := decoder.Decode(&job); err != nil {
        // 自行替换为你的错误处理逻辑
        panic(err)
    }
    // 解析完成,可通过job.Data[0]拿到单条数据
    fmt.Println(job)
}

如果你的文件后续改为JSON行格式(每行一个完整的压缩JSON对象),也可以继续使用scanner方案,只要先完成scanner初始化即可:

scanner := bufio.NewScanner(rc)
for scanner.Scan() {
    var job JD
    if err := json.Unmarshal(scanner.Bytes(), &job); err != nil {
        // 错误处理
    }
    fmt.Println(job)
}
if err := scanner.Err(); err != nil {
    // 处理scanner读取错误
}

内容的提问来源于stack exchange,提问作者Mikhail Ladonkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:54:04