2013-05-30 8 views
11

Używam Sockjsa z Go, ale kiedy klient javascript wysyła json do serwera, wymyka się temu i wysyła go jako bajt []. Próbuję dowiedzieć się, jak przeanalizować json, aby móc odczytać dane. ale dostaję ten błąd.Jak odrzucić ciąg znaków JSON z unikniętym hasłem w programie Go?

json: nie unmarshal ciąg do wartości Go typu main.Msg

Jak mogę rozwiązać ten problem? html.UnescapeString() nie działają:/

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

Warto również zauważyć, że html.UnescapeString() jest dla podmiotów HTML, takich jak gregghz

Odpowiedz

16

Możesz chcieć użyć strconv.Unquote na pierwszej swojej ciąg JSON :)

Here's an example, dzięki uprzejmości @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

Oto przykład przy użyciu strconv.Unquote: http://play.golang.org/p/id4f4r9tEr – gregghz

6

ty trzeba to naprawić w kodzie generującym JSON.

Kiedy się tak sformatuje, jest kodowany dwukrotnie JSON. Napraw kod, który generuje, tak aby zdarzył się tylko raz.

Oto niektóre JavaScript, które pokazuje, co się dzieje.

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

ten rozwiązany problem :) – Dany

2

Jak zauważył Crazy Train, okazuje się, że dane wejściowe są podwójnie uciekane, co powoduje problem. Jednym ze sposobów rozwiązania tego problemu jest upewnienie się, że funkcja session.ReadMessasge() zwraca właściwe dane wyjściowe, które są odpowiednio przekształcane. Jeśli jednak nie jest to możliwe, zawsze możesz zrobić to, co sugeruje x3ro i użyć funkcji golang strconv.Unquote.

Oto przykład plac zabaw z nim w akcji:

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

1

Masz do niesławnego uciekł ciąg pułapki z JavaScript. Dość często ludzie twarz (jak ja) ten sam problem w Go, gdy szeregowania JSON ciąg z json.Marshal, np

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

json.Marshal ucieka cudzysłowów, produkujących ten sam problem przy próbie unmarshal bajty w struct.

Jeśli napotkasz problem w Go, spójrz na numer How To Correctly Serialize JSON String In Golang, który szczegółowo opisuje problem wraz z jego rozwiązaniem.

Powiązane problemy