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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:15:42