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)
}
关键修改点:
- 错误处理优化:使用
http.Error替代panic,避免服务崩溃 - 重新序列化:使用
json.Marshal(t)将修改后的结构体编码为JSON字符串 - 返回完整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响应中。

