duanfan9859
2014-09-16 22:45
浏览 197

如何在Golang中将[] byte 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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • ds000001 2016-01-28 22:59
    已采纳

    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.

    点赞 打赏 评论
  • doushi9444 2014-09-17 04:08

    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
    ", result)
    }
    
    点赞 打赏 评论

相关推荐 更多相似问题