2013-05-30 26 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帖子,其中详细描述了该问题及其解决方案。