英文:
How to convert []byte XML to JSON output in Golang
问题
在Golang中,有一种方法可以将XML([]byte)转换为JSON输出。您可以尝试使用encoding/xml
包中的Unmarshal
函数进行转换。以下是您提供的代码示例的修改版本:
import (
"encoding/xml"
"encoding/json"
"io/ioutil"
"net/http"
"bytes"
"github.com/emicklei/go-restful"
)
// POST
func (u *UserResource) authenticateUser(request *restful.Request, response *restful.Response) {
App := new(Api)
App.url = "http://api.com/api"
usr := new(User)
err := request.ReadEntity(usr)
if err != nil {
response.AddHeader("Content-Type", "application/json")
response.WriteErrorString(http.StatusInternalServerError, err.Error())
return
}
buf := []byte("<app version=\"1.0\"><request>1111</request></app>")
r, err := http.Post(App.url, "text/plain", bytes.NewBuffer(buf))
if err != nil {
response.AddHeader("Content-Type", "application/json")
response.WriteErrorString(http.StatusInternalServerError, err.Error())
return
}
defer r.Body.Close()
body, err := ioutil.ReadAll(r.Body)
if err != nil {
response.AddHeader("Content-Type", "application/json")
response.WriteErrorString(http.StatusInternalServerError, err.Error())
return
}
// 将XML转换为JSON
var result map[string]interface{}
err = xml.Unmarshal(body, &result)
if err != nil {
response.AddHeader("Content-Type", "application/json")
response.WriteErrorString(http.StatusInternalServerError, err.Error())
return
}
// 将JSON转换为[]byte
jsonData, err := json.Marshal(result)
if err != nil {
response.AddHeader("Content-Type", "application/json")
response.WriteErrorString(http.StatusInternalServerError, err.Error())
return
}
response.AddHeader("Content-Type", "application/json")
response.WriteHeader(http.StatusCreated)
response.Write(jsonData)
}
以上代码将XML响应转换为JSON,并在进行一些操作后输出。您需要导入encoding/xml
和encoding/json
包,并对XML和JSON进行相应的解析和编码。
英文:
Is there a way to convert XML ([]byte) to JSON output in Golang?
I've got below function where body
is []byte
but I want to transform this XML response to JSON after some manipulation. I've tried Unmarshal
in xml
package with no success:
// POST
func (u *UserResource) authenticateUser(request *restful.Request, response *restful.Response) {
App := new(Api)
App.url = "http://api.com/api"
usr := new(User)
err := request.ReadEntity(usr)
if err != nil {
response.AddHeader("Content-Type", "application/json")
response.WriteErrorString(http.StatusInternalServerError, err.Error())
return
}
buf := []byte("<app version=\"1.0\"><request>1111</request></app>")
r, err := http.Post(App.url, "text/plain", bytes.NewBuffer(buf))
if err != nil {
response.AddHeader("Content-Type", "application/json")
response.WriteErrorString(http.StatusInternalServerError, err.Error())
return
}
defer r.Body.Close()
body, err := ioutil.ReadAll(r.Body)
response.AddHeader("Content-Type", "application/json")
response.WriteHeader(http.StatusCreated)
// err = xml.Unmarshal(body, &usr)
// if err != nil {
// fmt.Printf("error: %v", err)
// return
// }
response.Write(body)
// fmt.Print(&usr.userName)
}
I'm also using Go-restful package
答案1
得分: 13
将XML输入转换为JSON输出的通用答案可能如下所示:
package main
import (
"encoding/json"
"encoding/xml"
"fmt"
)
type DataFormat struct {
ProductList []struct {
Sku string `xml:"sku" json:"sku"`
Quantity int `xml:"quantity" json:"quantity"`
} `xml:"Product" json:"products"`
}
func main() {
xmlData := []byte(`<?xml version="1.0" encoding="UTF-8"?>
<ProductList>
<Product>
<sku>ABC123</sku>
<quantity>2</quantity>
</Product>
<Product>
<sku>ABC123</sku>
<quantity>2</quantity>
</Product>
</ProductList>`)
data := &DataFormat{}
err := xml.Unmarshal(xmlData, data)
if nil != err {
fmt.Println("Error unmarshalling from XML", err)
return
}
result, err := json.Marshal(data)
if nil != err {
fmt.Println("Error marshalling to JSON", err)
return
}
fmt.Printf("%s\n", result)
}
这段代码使用Go语言将XML数据解析为结构体,并将其转换为JSON格式。你可以将XML数据存储在xmlData
变量中,然后通过xml.Unmarshal
函数将其解析为DataFormat
结构体。接下来,使用json.Marshal
函数将结构体转换为JSON格式,并将结果打印出来。
英文:
The generic answer to your question of how to convert XML input to JSON output might be something like this:
http://play.golang.org/p/7HNLEUnX-m
package main
import (
"encoding/json"
"encoding/xml"
"fmt"
)
type DataFormat struct {
ProductList []struct {
Sku string `xml:"sku" json:"sku"`
Quantity int `xml:"quantity" json:"quantity"`
} `xml:"Product" json:"products"`
}
func main() {
xmlData := []byte(`<?xml version="1.0" encoding="UTF-8" ?>
<ProductList>
<Product>
<sku>ABC123</sku>
<quantity>2</quantity>
</Product>
<Product>
<sku>ABC123</sku>
<quantity>2</quantity>
</Product>
</ProductList>`)
data := &DataFormat{}
err := xml.Unmarshal(xmlData, data)
if nil != err {
fmt.Println("Error unmarshalling from XML", err)
return
}
result, err := json.Marshal(data)
if nil != err {
fmt.Println("Error marshalling to JSON", err)
return
}
fmt.Printf("%s\n", result)
}
答案2
得分: 11
如果您需要将一个具有未知结构的XML文档转换为JSON,您可以使用goxml2json。
示例:
import (
// 其他导入...
xj "github.com/basgys/goxml2json"
)
func (u *UserResource) authenticateUser(request *restful.Request, response *restful.Response) {
// 从restful.Request中提取数据
xml := strings.NewReader(`<?xml version="1.0" encoding="UTF-8"?><app version="1.0"><request>1111</request></app>`)
// 转换
json, err := xj.Convert(xml)
if err != nil {
// 出错了...
}
// ... 使用JSON ...
}
注意:我是这个库的作者。
英文:
If you need to convert an XML document to JSON with an unknown struct, you can use goxml2json.
Example :
import (
// Other imports ...
xj "github.com/basgys/goxml2json"
)
func (u *UserResource) authenticateUser(request *restful.Request, response *restful.Response) {
// Extract data from restful.Request
xml := strings.NewReader(`<?xml version="1.0" encoding="UTF-8"?><app version="1.0"><request>1111</request></app>`)
// Convert
json, err := xj.Convert(xml)
if err != nil {
// Oops...
}
// ... Use JSON ...
}
> Note : I'm the author of this library.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论