How to convert [] byte XML to JSON output in Golang

Is there a way to convert XML ([] byte) to JSON output in Golang?

I have a function below body []byte , but I want to convert this XML response to JSON after some manipulations. I tried Unmarshal in the xml package without 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 also use Go-restful package

+5
source share
2 answers

If you need to convert an XML document to JSON with an unknown structure, 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 am the author of this library.

+4
source

The general answer to the 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) } 
+10
source

Source: https://habr.com/ru/post/1202718/


All Articles