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
相关产品推荐
相关产品推荐

