2013-05-30 25 views
11

đang sử dụng Sockjs with Go, nhưng khi máy khách javascript gửi json đến máy chủ, nó thoát nó và gửi nó dưới dạng byte []. Tôi đang cố gắng tìm ra cách phân tích cú pháp json, để tôi có thể đọc dữ liệu. nhưng tôi nhận được lỗi này.Làm thế nào để unmarshal một chuỗi JSON thoát trong Go?

json: không thể chuỗi không chính xác vào giá trị Go của loại chính.Msg

Làm cách nào để khắc phục sự cố này? html.UnescapeString() đã không có tác dụng:/

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

Nó cũng đáng chú ý là html.UnescapeString() là cho các tổ chức html như gregghz

Trả lời

16

Bạn có thể muốn sử dụng strconv.Unquote trên chuỗi của bạn JSON đầu tiên :)

Here's an example, vui lòng cung cấp bởi @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

Dưới đây là một ví dụ sử dụng strconv.Unquote: http://play.golang.org/p/id4f4r9tEr – gregghz

6

Bạn cần sửa lỗi này trong mã đang tạo JSON.

Khi nó được định dạng như vậy, nó đang được mã hóa JSON hai lần. Sửa mã đó đang làm việc tạo ra để nó chỉ xảy ra một lần.

Dưới đây là một số JavaScript cho thấy những gì đang diễn ra.

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

này giải quyết vấn đề :) – Dany

2

Như Crazy Train chỉ ra, có vẻ như đầu vào của bạn là gấp đôi trốn thoát, do đó gây ra vấn đề. Một cách để sửa lỗi này là đảm bảo rằng hàm session.ReadMessasge() trả về kết quả đầu ra thích hợp được thoát một cách thích hợp. Tuy nhiên, nếu điều đó là không thể, bạn luôn có thể làm những gì x3ro gợi ý và sử dụng hàm golang strconv.Unquote.

Dưới đây là một ví dụ sân chơi của nó trong hành động:

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

1

Bạn đã vào khét tiếng thoát chuỗi cạm bẫy từ JavaScript. Khá thường xuyên phải đối mặt với mọi người (như tôi đã làm) cùng một vấn đề tại Gò, khi tuần tự JSON chuỗi với json.Marshal, ví dụ:

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

json.Marshal thoát dấu ngoặc kép, sản xuất cùng một vấn đề khi bạn cố gắng unmarshal bytes vào struct.

Nếu bạn gặp vấn đề trong Go, hãy xem How To Correctly Serialize JSON String In Golang bài mô tả sự cố chi tiết với giải pháp cho vấn đề đó.

Các vấn đề liên quan