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未绑定输入流:你拿到云存储的Reader
rc后没有初始化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
相关产品推荐
相关产品推荐

