我正在使用带有Go的Sockjs,但是当javascript客户端将json发送到服务器时,它会将其转义,并将其作为[]字节发送.我正在试图找出如何解析json,以便我可以读取数据.但我得到这个错误.
json:无法将字符串解组为main.Msg类型的Go值
我怎样才能解决这个问题?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
Run Code Online (Sandbox Code Playgroud)
fre*_*oma 33
你可能想先strconv.Unquote在你的JSON字符串上使用:)
这是一个由@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)
}
Run Code Online (Sandbox Code Playgroud)
小智 12
您需要在生成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\"}"
Run Code Online (Sandbox Code Playgroud)
sem*_*e21 10
有时,strconv.Unquote不起作用。
Heres一个例子显示了问题和我的解决方案。(游乐场链接:https : //play.golang.org/p/Ap0cdBgiA05)
感谢@Crazy Train 的“编码两次”的想法,我只解码了两次......
package main
import (
"encoding/json"
"fmt"
"strconv"
)
type Wrapper struct {
Data string
}
type Msg struct {
Photo string
}
func main() {
var wrapper Wrapper
var original = `"{\"photo\":\"https:\/\/www.abc.net\/v\/t1.0-1\/p320x320\/123.jpg\"}"`
_, err := strconv.Unquote(original)
fmt.Println(err)
var val []byte = []byte("{\"data\":"+original+"}")
fmt.Println(string(val))
err = json.Unmarshal([]byte(val), &wrapper)
fmt.Println(wrapper.Data)
var msg Msg
err = json.Unmarshal([]byte(wrapper.Data), &msg)
fmt.Println(msg.Photo)
}
Run Code Online (Sandbox Code Playgroud)