Golang中JSON字符串替换的实现方法

Golang中JSON字符串替换的实现方法 我需要帮助以编程方式修改JSON字符串。

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"strings"
	xj "github.com/basgys/goxml2json"
)

type PostJsonData struct {
	ReqHeader struct {
		ChannelID   string `json:"Channel_ID"`
		ServiceID   string `json:"Service_ID"`
		RequestID   string `json:"Request_ID"`
		RequestDate string `json:"Request_Date"`
	} `json:"ReqHeader"`
	ReqBody struct {
		XML string `json:"XML"`
	} `json:"ReqBody"`
}

func parseGhPost(rw http.ResponseWriter, request *http.Request) {
	decoder := json.NewDecoder(request.Body)

	var t PostJsonData
	err := decoder.Decode(&t)

	if err != nil {
		panic(err)
	}
	xml := strings.NewReader(t.ReqBody.XML)
	json, err := xj.Convert(xml)
	if err != nil {
		panic("That's embarrassing...")
	}
	t.ReqBody.XML = json.String()
	fmt.Println(t)
}

func main() {
	http.HandleFunc("/", parseGhPost)
	http.ListenAndServe(":3000", nil)
}

收到的JSON是:

{
	"ReqHeader": {
		"Channel_ID": "IndianPCS",
		"Service_ID": "1051",
		"Request_ID": "233111111",
		"Request_Date": "20190423"
	},
	"ReqBody": {
		"XML": "REQCACReqAsstOfCargoCharges20190926661643719rudss001kndlpt001NIXY12019091271223521725092019319EX5392019GINRCFA894905911040FNEN1WH911823C9 AROMATIC SOLVENT C91396.000MTNN26092019100133"
	}
}

我需要将XML字符串转换为JSON,并插回原处,最终我需要完整的JSON,但我无法通过上述代码获取完整的JSON,其余部分我已经完成了。


更多关于Golang中JSON字符串替换的实现方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中JSON字符串替换的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在您的代码中,t.ReqBody.XML = json.String() 只是修改了结构体字段的值,但没有重新序列化为完整的JSON字符串。要获取完整的JSON,您需要在转换后重新编码整个结构体。

以下是修改后的实现:

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"strings"
	xj "github.com/basgys/goxml2json"
)

type PostJsonData struct {
	ReqHeader struct {
		ChannelID   string `json:"Channel_ID"`
		ServiceID   string `json:"Service_ID"`
		RequestID   string `json:"Request_ID"`
		RequestDate string `json:"Request_Date"`
	} `json:"ReqHeader"`
	ReqBody struct {
		XML string `json:"XML"`
	} `json:"ReqBody"`
}

func parseGhPost(rw http.ResponseWriter, request *http.Request) {
	decoder := json.NewDecoder(request.Body)

	var t PostJsonData
	err := decoder.Decode(&t)

	if err != nil {
		http.Error(rw, err.Error(), http.StatusBadRequest)
		return
	}
	
	// 将XML字符串转换为JSON
	xml := strings.NewReader(t.ReqBody.XML)
	convertedJSON, err := xj.Convert(xml)
	if err != nil {
		http.Error(rw, "XML转换失败", http.StatusInternalServerError)
		return
	}
	
	// 更新结构体中的XML字段为转换后的JSON字符串
	t.ReqBody.XML = convertedJSON.String()
	
	// 将整个结构体重新编码为JSON
	finalJSON, err := json.Marshal(t)
	if err != nil {
		http.Error(rw, err.Error(), http.StatusInternalServerError)
		return
	}
	
	// 设置响应头并返回完整的JSON
	rw.Header().Set("Content-Type", "application/json")
	rw.WriteHeader(http.StatusOK)
	rw.Write(finalJSON)
	
	// 打印到控制台(可选)
	fmt.Println(string(finalJSON))
}

func main() {
	http.HandleFunc("/", parseGhPost)
	http.ListenAndServe(":3000", nil)
}

关键修改点:

  1. 错误处理优化:使用 http.Error 替代 panic,避免服务崩溃
  2. 重新序列化:使用 json.Marshal(t) 将修改后的结构体编码为JSON字符串
  3. 返回完整JSON:通过HTTP响应返回完整的JSON数据

如果您需要将转换后的JSON作为对象而不是字符串插入,可以修改结构体定义:

type PostJsonData struct {
	ReqHeader struct {
		ChannelID   string `json:"Channel_ID"`
		ServiceID   string `json:"Service_ID"`
		RequestID   string `json:"Request_ID"`
		RequestDate string `json:"Request_Date"`
	} `json:"ReqHeader"`
	ReqBody struct {
		XML json.RawMessage `json:"XML"`
	} `json:"ReqBody"`
}

func parseGhPost(rw http.ResponseWriter, request *http.Request) {
	decoder := json.NewDecoder(request.Body)

	var t PostJsonData
	err := decoder.Decode(&t)

	if err != nil {
		http.Error(rw, err.Error(), http.StatusBadRequest)
		return
	}
	
	// 将XML字符串转换为JSON
	xml := strings.NewReader(string(t.ReqBody.XML))
	convertedJSON, err := xj.Convert(xml)
	if err != nil {
		http.Error(rw, "XML转换失败", http.StatusInternalServerError)
		return
	}
	
	// 直接使用转换后的JSON RawMessage
	t.ReqBody.XML = json.RawMessage(convertedJSON.String())
	
	// 将整个结构体重新编码为JSON
	finalJSON, err := json.Marshal(t)
	if err != nil {
		http.Error(rw, err.Error(), http.StatusInternalServerError)
		return
	}
	
	rw.Header().Set("Content-Type", "application/json")
	rw.WriteHeader(http.StatusOK)
	rw.Write(finalJSON)
}

这样转换后的XML会作为JSON对象(而不是字符串)嵌入到最终的JSON响应中。

回到顶部