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

使用Go语言解析包含嵌套JSON对象的CSV文件

解决Go中解析含JSON列的CSV文件问题

我来帮你搞定这个CSV解析的问题!你的场景里最后一列是JSON对象(还包含空对象的情况),咱们可以一步步完善代码,确保解析正确:

第一步:定义对应JSON的结构体(可选但推荐)

为了类型安全,我们先定义一个结构体来匹配JSON字段的结构,如果你的JSON字段是动态的,也可以用map[string]interface{}替代:

type Attributes struct {
    Att1Numeric int    `json:"Att1Numeric"`
    Att2String  string `json:"Att2String"`
}

第二步:补全并完善解析函数

下面是完整的processFileAsCSV函数,包含了错误处理、CSV读取和JSON解析的完整逻辑:

import (
    "encoding/csv"
    "encoding/json"
    "fmt"
    "io"
    "mime/multipart"
)

type Attributes struct {
    Att1Numeric int    `json:"Att1Numeric"`
    Att2String  string `json:"Att2String"`
}

func processFileAsCSV(f *multipart.Part) (int, error) {
    reader := csv.NewReader(f)
    reader.LazyQuotes = true // 核心设置:处理JSON中的双引号,避免解析冲突
    reader.Comma = ','

    lineCount := 0

    // 先读取表头(如果不需要处理表头,也可以跳过这一步)
    _, err := reader.Read()
    if err != nil {
        return lineCount, fmt.Errorf("读取表头失败: %w", err)
    }

    for {
        line, err := reader.Read()
        if err != nil {
            if err == io.EOF {
                break // 正常结束循环
            }
            if err == csv.ErrFieldCount {
                return lineCount, fmt.Errorf("第%d行列数不匹配: %w", lineCount+1, err)
            }
            return lineCount, fmt.Errorf("读取行失败: %w", err)
        }

        lineCount++

        // 确保当前行有足够的列数(你的CSV是4列)
        if len(line) < 4 {
            return lineCount, fmt.Errorf("第%d行字段不足", lineCount)
        }

        // 取出最后一列的JSON字符串
        attrJSON := line[3]

        // 解析JSON到结构体
        var attrs Attributes
        if err := json.Unmarshal([]byte(attrJSON), &attrs); err != nil {
            return lineCount, fmt.Errorf("第%d行解析JSON失败: %w", lineCount, err)
        }

        // 这里可以添加你的业务逻辑,比如打印、存储数据等
        fmt.Printf("处理第%d行: ID=%s, Value=%s, 属性=%+v\n", lineCount, line[0], line[1], attrs)
    }

    return lineCount, nil
}

关键细节说明

  • LazyQuotes的必要性:因为你的JSON字段里包含双引号(比如"Att2String": "abc"),默认的CSV解析器会把这些引号当成字段分隔符,导致解析失败。开启LazyQuotes后,解析器会允许字段内的引号不转义,完美适配这种场景。
  • 空JSON对象处理:空的{}在反序列化时不会报错,结构体的字段会被设为零值(Att1Numeric=0,Att2String=""),如果用map[string]interface{}的话会得到一个空map,完全符合预期。
  • 错误处理:函数里添加了多种错误场景的处理,包括表头读取失败、行列数不匹配、JSON解析失败等,并且用%w包装原始错误,方便后续调试和错误链追踪。
  • 动态JSON字段兼容:如果你的JSON字段不固定,把Attributes结构体换成map[string]interface{}即可,解析逻辑完全通用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:13:20