如何在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

drdyf42880
drdyf42880 是。我将XML输入作为字符串输入,因为它是直接从客户端Javascript接收的。
接近 6 年之前 回复
dtqscvrzn968518698
dtqscvrzn968518698 啊,我对编码/xml不太了解,但是我知道它无法写入小写字段(包之外的任何内容都不能)。我不知道您如何进行映射,但是如果您想研究,Unmarshal映射规则位于golang.org/pkg/encoding/xml/#Unmarshal。
接近 6 年之前 回复
douchang8219
douchang8219 当我尝试fmt.Print(&usr.userName)时,它将nil输出到控制台
接近 6 年之前 回复
douyi1966
douyi1966 要以直接的方式对其使用encoding/xml和encoding/json,您需要创建镜像XML响应格式的结构。使用地图可能有解决此问题的方法,但我不知道。
接近 6 年之前 回复
doubi1910
doubi1910 我已经输入了XML响应
接近 6 年之前 回复

2个回答

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.

dongyi1015
dongyi1015 谢谢,我修复了代码段
3 年多之前 回复
douchen2595
douchen2595 修复示例:(这很好)func main(){// xml是io.Reader xml:= strings.NewReader(<?xml version =“ 1.0” encoding =“ UTF-8”?> <hello> world < / hello>)json,错误:= xj.Convert(xml),如果错误!= nil {panic(“那真令人尴尬...”)} fmt.Println(json.String())// {“ hello”:“ 世界“}}
3 年多之前 回复
duan0424
duan0424 在这里不工作。 相同的摘要结果“”
3 年多之前 回复

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)
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐