json - 解码 json,包括 json 编码的字符串

标签 json go decode

嘿伙计们,我正在从外部 Api 获取 websocket 信息,它以这种方式给我 json 响应:

 `{"name":"message","args":["{\"method\":\"chatMsg\",\"params\":{\"channel\":\"channel\",\"name\":\"name\",\"nameColor\":\"B5B11E\",\"text\":\"<a href=\\\"https://play.spotify.com/browse\\\" target=\\\"_blank\\\">https://play.spotify.com/browse</a>\",\"time\":1455397119}}"]}`

我把它放到这个结构中

type main struct {

Name string `json:"name"`
Args []arg  `json:"args"`
}

type arg struct {
    Method string`json:"method"`
    Params par `json:"params"`
}
type par struct {
    Channel     string `json:"channel,omitempty"`
    Name        string `json:"name,omitempty"`
    NameColor   string `json:"nameColor,omitempty"`
    Text        string `json:"text,omitempty"`
    Time        int64  `json:"time,omitempty"`
}

并用代码解码

sReplace := strings.NewReplacer(`"{`, "{", `"]`, "]", "\\", ``)
strN := sReplace.Replace(str)
r := strings.NewReader(strN)
d := json.NewDecoder(r)
m := main{}

我遇到了错误

invalid character 'h' after object key:value pair

我知道错误是文本字段值的结果。有什么好的方法可以清理它或告诉解码器忽略文本字段的内容吗?

最佳答案

应用程序正在解析包含子字符串 "text":"<a href="https 的数据.这不是有效的 JSON。错误消息提示 hhref .

因为 JSON 值包含编码的 JSON 值,应用程序必须分两步解码:

type main struct {
  Name string   `json:"name"`
  Args []string `json:"args"`
}

type arg struct {
  Method string `json:"method"`
  Params par    `json:"params"`
}
type par struct {
  Channel   string `json:"channel,omitempty"`
  Name      string `json:"name,omitempty"`
  NameColor string `json:"nameColor,omitempty"`
  Text      string `json:"text,omitempty"`
  Time      int64  `json:"time,omitempty"`
}

str := `{"name":"message","args":["{\"method\":\"chatMsg\",\"params\":{\"channel\":\"channel\",\"name\":\"name\",\"nameColor\":\"B5B11E\",\"text\":\"<a href=\\\"https://play.spotify.com/browse\\\" target=\\\"_blank\\\">https://play.spotify.com/browse</a>\",\"time\":1455397119}}"]}`
var m main
if err := json.Unmarshal([]byte(str), &m); err != nil {
    log.Fatal(err)
}
var args arg
if err := json.Unmarshal([]byte(m.Args[0]), &args); err != nil {
    log.Fatal(err)
}

playground example

关于json - 解码 json,包括 json 编码的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35387215/

相关文章:

javascript - 如何在记录之前等待 json 返回值(返回至少需要 30 秒)? JavaScript/ react /表达

javascript - 在javascript中使用变量的值来访问JSON对象

json - 无法生成 JSON - javax.ws.rs.WebApplicationException : com. sun.jersey.api.MessageException

go - 同一 Channel 中的两个 goroutine - 它们是如何执行的?

Docker 容器网络主机模式适用于 CLI,但不适用于 Go SDK

java - 只知道 key 长度才能破解Vigenere

json - 如何删除 symfony json 中的代理字段

performance - ffmpeg 在没有 avformat_find_stream_info 的情况下解码慢速调用

当 getBytes "hello"时,Java 字符串 ("UTF-16"有 12 个字节)?

http - 如何在golang中生成查询字符串?