嘿伙计我从外部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
我知道错误是文本字段值的结果。有没有什么好方法可以清理它或告诉解码器忽略文本字段的内容?
答案 0 :(得分:2)
应用程序正在解析包含子串"text":"<a href="https
的数据。这不是有效的JSON。该错误消息抱怨h
中的href
。
因为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)
}