2014-09-16 21 views
5

Czy istnieje sposób konwersji XML ([] bajtów) na wyjście JSON w Golang?Jak przekonwertować [] bajt XML do wyjścia JSON w Golang

Mam poniżej funkcji, gdzie body jest []byte, ale chcę przekształcić tę odpowiedź XML na JSON po jakiejś manipulacji. Próbowałem Unmarshal w xml pakietu bez powodzenia:

// 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) 
} 

Używam również pakiet Go-spokojny

+0

@DewyBroto Włożyłam w odpowiedzi XML –

+1

użycie 'kodowania/xml' i' kodowania/json' za to w prosty sposób, trzeba utworzyć 'struct's mirroring formatu XML odpowiedzi . Są prawdopodobnie sposoby, aby ominąć to używając 'map's, ale ja ich nie znam. – twotwotwo

+0

Kiedy próbuję 'fmt.Print (& usr.userName)' wyprowadza zero do konsoli –

Odpowiedz

4

Jeśli trzeba przekonwertować dokument XML do JSON z nieznanym s prawdą, możesz użyć goxml2json.

Przykład:

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 ... 
} 

Uwaga: Jestem autorem tej biblioteki.

+0

nie działa tutaj. Taki sam wynik fragment "" – luizfelipetx

+0

mocowania przykład: (to działa prawidłowo) func main() {// \t xml jest io.Reader \t xml: = strings.NewReader (' świat ') \t json, err:?! = xj.Convert (XML) \t jeśli błądzą = nil { \t \t panika ("to żenujące ...") \t} \t fmt.Println (json.String()) \t // {"cześć": "świat"} } – luizfelipetx

+0

@luizfelipetx Dziękuję, poprawiłem fragment – basgys

10

Odpowiedź generic do kwestii, jak konwertować XML wejściowego do wyjścia JSON może być coś tak:

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) 
}