2013-05-30 19 views
11

sto usando Sockjs con Go, ma quando il client javascript invia json al server lo scappa e lo invia come un byte []. Sto cercando di capire come analizzare il json, in modo da poter leggere i dati. ma ottengo questo erroreCome rimuovere unmarshal una stringa JSON con escape in Go?

JSON: non può stringa unmarshal in valore Go di tipo main.Msg

come posso risolvere questo problema? html.UnescapeString() hanno nessun effetto:/

val, err := session.ReadMessage() 
if err != nil { 
break 
} 
var msg Msg 

err = json.Unmarshal(val, &msg) 

fmt.Printf("%v", val) 
fmt.Printf("%v", err) 

type Msg struct { 
    Channel string 
    Name string 
    Msg  string 
} 


//Output 
"{\"channel\":\"buu\",\"name\":\"john\", \"msg\":\"doe\"}" 
json: cannot unmarshal string into Go value of type main.Msg 
+1

E 'anche interessante notare che html.UnescapeString() è per entità HTML come gregghz

risposta

16

si potrebbe desiderare di utilizzare strconv.Unquote sulla stringa JSON prima :)

Here's an example, gentilmente fornito da @gregghz:

package main 

import (
    "encoding/json" 
    "fmt" 
    "strconv" 
) 

type Msg struct { 
    Channel string 
    Name string 
    Msg string 
} 

func main() { 
    var msg Msg 
    var val []byte = []byte(`"{\"channel\":\"buu\",\"name\":\"john\", \"msg\":\"doe\"}"`) 

    s, _ := strconv.Unquote(string(val)) 

    err := json.Unmarshal([]byte(s), &msg) 

    fmt.Println(s) 
    fmt.Println(err) 
    fmt.Println(msg.Channel, msg.Name, msg.Msg) 
} 
+5

Ecco un esempio utilizzando strconv.Unquote: http://play.golang.org/p/id4f4r9tEr – gregghz

6

È è necessario risolvere questo problema nel codice che genera il JSON.

Quando risulta formattato in questo modo, viene codificato JSON due volte. Correggi quel codice che sta facendo la generazione in modo che avvenga solo una volta.

Ecco alcuni JavaScript che mostrano cosa sta succedendo.

// Start with an object 
var object = {"channel":"buu","name":"john", "msg":"doe"}; 

// serialize once 
var json = JSON.stringify(object); // {"channel":"buu","name":"john","msg":"doe"} 

// serialize twice 
json = JSON.stringify(json); // "{\"channel\":\"buu\",\"name\":\"john\",\"msg\":\"doe\"}" 
+0

Questo risolto il problema :) – Dany

2

Come sottolineato da Crazy Train, sembra che l'input sia stato doppiamente evaso, causando così il problema. Un modo per risolvere questo problema è assicurarsi che la funzione session.ReadMessasge() restituisca l'output corretto che viene scappato in modo appropriato. Tuttavia, se ciò non è possibile, puoi sempre fare ciò che x3ro ha suggerito e utilizzare la funzione golang strconv.Unquote.

Ecco un esempio di parco giochi in azione:

http://play.golang.org/p/GTishI0rwe

1

You got in infame sfuggito stringa trabocchetto da JavaScript. Molto spesso la gente faccia (come ho fatto io) lo stesso problema in Go, durante la serializzazione stringa JSON con json.Marshal, ad esempio:

in := `{"firstName":"John","lastName":"Dow"}` bytes, err := json.Marshal(in)

json.Marshal sfugge virgolette doppie, producendo lo stesso problema quando si tenta di byte unmarshal in struct.

Se si è verificato il problema in Go, dare un'occhiata al post How To Correctly Serialize JSON String In Golang che descrive il problema nei dettagli con una soluzione.

Problemi correlati