如何解组转义的 JSON 字符串

新手上路,请多包涵

我在 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

原文由 Robin Westerlundh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

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

这是一个示例,由@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)
}

原文由 fresskoma 发布,翻译遵循 CC BY-SA 3.0 许可协议

您需要在生成 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\"}"

原文由 user2437417 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题