2013-05-30 28 views
11

am使用Sockjs和Go,但是當javascript客戶端發送json到服務器時,它會轉義它,並將它作爲[]字節發送。我想弄清楚如何解析JSON,以便我可以讀取數據。但我得到這個錯誤。如何在Go中解組轉義的JSON字符串?

JSON:不能解組串入型main.Msg的圍棋值

我怎麼能解決這個問題? html.UnescapeString()沒有影響:/

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

另外值得一提的是,html.UnescapeString()是用於HTML實體像<對比<和不去除斜線 – gregghz

回答

16

你可能想在你的JSON字符串第一:)

Here's an example,由@gregghz友情提供使用strconv.Unquote

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

下面是使用strconv.Unquote一個例子:http://play.golang.org/p/id4f4r9tEr – gregghz

6

你需要在生成JSON的代碼中解決這個問題。

當它變成這樣的格式時,它被JSON編碼了兩次。修復正在執行生成的代碼,以便它只發生一次。

下面是一些顯示正在發生的事情的JavaScript。

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

這解決了這個問題:) – Dany

2

正如Crazy Train指出的那樣,您的輸入似乎是雙倍逃脫的,因此引發了這個問題。解決這個問題的一個方法是確保函數session.ReadMessasge()返回適當轉義的正確輸出。但是,如果這是不可能的,你總是可以做x3ro建議的,並使用golang函數strconv.Unquote

下面是它的一個操場例子在行動:

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

1

,你進了臭名昭著的轉義字符串陷阱從JavaScript。很多時候,人們面對(像我一樣),同樣的問題在Go,序列化JSON字符串json.Marshal,例如當:

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

json.Marshal轉義雙引號,產生同樣的問題,當你嘗試將字節解組成結構。

如果您在Go中遇到問題,請查看How To Correctly Serialize JSON String In Golang帖子,其中詳細描述了該問題及其解決方案。