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

Golang json.Unmarshal解析JSON报错,输入文件含末尾多余逗号不可改如何解决

报错原因

Go官方标准库encoding/json严格遵守RFC 8259 JSON语法规范,明确禁止两种语法:

  • 数组最后一个元素后添加尾随逗号
  • 对象最后一个键值对后添加尾随逗号

你提供的输入文件存在两处不符合规范的语法:patterns数组最后一个对象后存在多余逗号、最外层对象最后一个属性后也存在多余逗号。标准库反序列化时读到逗号后会预期后续还有新的元素/属性,直接遇到]或}闭合符就会抛出invalid character ']' looking for beginning of value的错误。

兼容解决方案

你无法修改输入文件的前提下,可以使用支持宽松JSON解析的第三方库,优先推荐改造成本最低的github.com/json-iterator/go,也可以选择github.com/tidwall/gjson。

使用json-iterator/go兼容

该库完全兼容标准库API,仅需少量修改初始化配置即可支持尾随逗号,原有业务逻辑不需要改动:

import jsoniter "github.com/json-iterator/go"

// 初始化宽松模式的JSON解析器
var json = jsoniter.Config{
    AllowTrailingComma: true, // 允许数组/对象末尾尾随逗号
    AllowComments: true, // 如果输入JSON还有//注释,可开启这个配置兼容
    EscapeHTML: true, // 保持和标准库默认行为一致
}.Froze()

// 后续用法和标准库完全一致
err = json.Unmarshal(content, cfg)
if err != nil {
    log.StartLogger.Fatalf("[config] [default load] json unmarshal config failed, error: %v", err)
}
return cfg

使用gjson兼容

如果不需要解析全量结构体,只需要读取JSON中部分字段,gjson的性能更优,也原生支持带尾随逗号、注释的非标准JSON解析:

import "github.com/tidwall/gjson"

content, _ := ioutil.ReadFile("./test.json")
// 直接解析内容
res := gjson.ParseBytes(content)
// 示例:读取stats_matcher.inclusion_list.patterns数组的长度
patternCount := res.Get("stats_matcher.inclusion_list.patterns.#").Int()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 13:54:02