Go语言解析指定格式字符串转结构体 能否用json.Unmarshal实现更优雅方案
结论
完全没有必要强行用json.Unmarshal实现该需求,反而会增加冗余逻辑、降低解析鲁棒性,你现有的正则实现已经是非常高效合理的方案。
原因说明
你当前解析的原始字符串格式完全不符合JSON语法规范,要使用json.Unmarshal必须先做预处理把源串转换为合法JSON结构,这一步你依然绕不开字符串匹配/替换操作,等于额外多了「转JSON → 反序列化」两步开销,得不偿失。
非要用json.Unmarshal的实现(不推荐)
如果你一定要尝试这种方案,可以参考以下实现思路,核心是通过字符串替换把源串转为合法JSON再反序列化:
import ( "encoding/json" "strings" "log" ) func ParseWithJSON() { str := "Version[2f0] Terminal[10002] Machine[10.1.1.1] DH[0.137%] Temp[45] Fan[0] Vo[4074 4042 4058 4098] CRC[0 0 0 0]" // 预处理转换为JSON格式 jsonStr := `{"` + strings.ReplaceAll(strings.ReplaceAll(str, "[", `": ["`), "] ", `"], "`) + `"}` var res map[string][]string err := json.Unmarshal([]byte(jsonStr), &res) if err != nil { log.Fatal(err) } log.Printf("%+v", res) }
该方案的明显缺陷:
- 容错性极低,只要Key名称或者Value值中出现空格、方括号字符,JSON转换就会直接失败
- 性能不如原生正则方案,多了两次全量字符串替换和一次JSON反序列化开销
更优雅的优化方向
如果你觉得当前返回map[string][]string使用不够方便,想要直接绑定到自定义结构体,可以基于你现有的正则逻辑,通过反射读取结构体tag做字段映射即可,不需要引入JSON序列化能力。
内容的提问来源于stack exchange,提问作者Oleg E
相关产品推荐
相关产品推荐

