首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解组转义的JSON字符串

如何解组转义的JSON字符串
EN

Stack Overflow用户
提问于 2013-05-30 22:01:06
回答 6查看 70.8K关注 0票数 45

我正在使用带有Go的Sockjs,但是当JavaScript客户端向服务器发送json时,它会将其转义,并将其作为一个[]字节发送。我试图弄清楚如何解析json,以便读取数据。但我明白这个错误。

json:不能将字符串解组为main.Msg类型的Go值

我怎样才能解决这个问题呢?html.UnescapeString()没有效果。

代码语言:javascript
复制
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
}
代码语言:javascript
复制
//Output
"{\"channel\":\"buu\",\"name\":\"john\", \"msg\":\"doe\"}"
json: cannot unmarshal string into Go value of type main.Msg
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-05-30 23:02:46

您可能想首先在JSON字符串上使用strconv.Unquote :)

下面是一个例子,由@gregghz提供:

代码语言:javascript
复制
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)
}
票数 74
EN

Stack Overflow用户

发布于 2013-05-30 23:02:55

您需要在生成JSON的代码中修复这个问题。

当它变成那样的格式时,它被编码了两次。修正正在进行生成的代码,使其只发生一次。

下面是一些JavaScript,它显示了正在发生的事情。

代码语言: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\"}"
票数 14
EN

Stack Overflow用户

发布于 2018-05-03 09:43:59

有时,strconv.Unquote不起作用。

这里的一个例子显示了问题和我的解决方案。(操场链接:https://play.golang.org/p/Ap0cdBgiA05)

谢谢@Crazy列车的“编码两次”的想法,我只是破译了两次.

代码语言:javascript
复制
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)
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16846553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档