如何在Golang中去除原始JSON中的反斜杠转义字符
解决Golang中去除JSON输入里的反斜杠问题
你提供的JSON内容属于双重转义格式(每个双引号前都有多余的反斜杠\),以下是两种可行的解决方案:
方法一:直接字符串替换(仅限确定无合法转义的场景)
如果能确认所有反斜杠都是多余的转义符,可以直接用strings.ReplaceAll批量替换:
package main import ( "fmt" "strings" ) func main() { rawJSON := `[ { \"type\":\"Non Custom\", \"so_no\":\"3250109150\", \"material_code\":\"F100101180028\", \"po_no\":\"JDC/00067/02/22/2/DL\", \"pr_no\":\"\", \"gr_no\":\"\", \"gr_date\":\"\" }, { \"type\":\"Non Custom\", \"so_no\":\"3250109150\", \"material_code\":\"F100101180030\", \"po_no\":\"JDC/00067/02/22/2/DL\", \"pr_no\":\"\", \"gr_no\":\"\", \"gr_date\":\"\" } ]` // 替换所有 \" 为 " cleanedJSON := strings.ReplaceAll(rawJSON, "\\\"", "\"") fmt.Println(cleanedJSON) }
注意:这种方法存在局限性——如果JSON中包含合法的转义内容(比如字符串值本身带
\",例如"desc":"User said \"OK\""),直接替换会破坏原始语义,仅适合处理明确是多余转义的场景。
方法二:JSON解析后重新序列化(推荐,安全可靠)
本质上,你的输入是被错误转义的JSON字符串,正确的做法是先将其解析为Go数据结构,再重新序列化为标准JSON(自动去除多余转义):
方式1:通用解析(无需定义结构体)
适合不确定JSON结构的场景:
package main import ( "encoding/json" "fmt" ) func main() { rawJSON := `[ { \"type\":\"Non Custom\", \"so_no\":\"3250109150\", \"material_code\":\"F100101180028\", \"po_no\":\"JDC/00067/02/22/2/DL\", \"pr_no\":\"\", \"gr_no\":\"\", \"gr_date\":\"\" }, { \"type\":\"Non Custom\", \"so_no\":\"3250109150\", \"material_code\":\"F100101180030\", \"po_no\":\"JDC/00067/02/22/2/DL\", \"pr_no\":\"\", \"gr_no\":\"\", \"gr_date\":\"\" } ]` var data interface{} // 第一步:解析带转义的JSON为Go原生数据结构 if err := json.Unmarshal([]byte(rawJSON), &data); err != nil { fmt.Printf("解析失败:%v\n", err) return } // 第二步:重新序列化为标准格式化JSON cleanedJSON, err := json.MarshalIndent(data, "", " ") if err != nil { fmt.Printf("序列化失败:%v\n", err) return } fmt.Println(string(cleanedJSON)) }
方式2:结构体解析(性能更优,适合已知结构的场景)
如果清楚JSON的结构,定义对应的结构体可以提升解析效率并获得类型安全:
package main import ( "encoding/json" "fmt" ) // 定义与JSON结构匹配的结构体 type Order struct { Type string `json:"type"` SonNo string `json:"so_no"` MaterialCode string `json:"material_code"` PONo string `json:"po_no"` PRNo string `json:"pr_no"` GRNo string `json:"gr_no"` GRDate string `json:"gr_date"` } func main() { rawJSON := `[ { \"type\":\"Non Custom\", \"so_no\":\"3250109150\", \"material_code\":\"F100101180028\", \"po_no\":\"JDC/00067/02/22/2/DL\", \"pr_no\":\"\", \"gr_no\":\"\", \"gr_date\":\"\" }, { \"type\":\"Non Custom\", \"so_no\":\"3250109150\", \"material_code\":\"F100101180030\", \"po_no\":\"JDC/00067/02/22/2/DL\", \"pr_no\":\"\", \"gr_no\":\"\", \"gr_date\":\"\" } ]` var orders []Order // 解析为结构体切片 if err := json.Unmarshal([]byte(rawJSON), &orders); err != nil { fmt.Printf("解析失败:%v\n", err) return } // 重新序列化 cleanedJSON, err := json.MarshalIndent(orders, "", " ") if err != nil { fmt.Printf("序列化失败:%v\n", err) return } fmt.Println(string(cleanedJSON)) }
这种方法会自动保留合法的转义内容,同时去除多余的反斜杠,是最安全可靠的解决方案。
内容的提问来源于stack exchange,提问作者Endi Julian
相关产品推荐
相关产品推荐

