解码包含JSON编码字符串的JSON。

huangapple go评论82阅读模式
英文:

decode json including json encoded strings

问题

嗨,我正在从外部 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 字段的值引起的。有没有好的方法来清理它,或者告诉解码器忽略 text 字段的内容?

英文:

Hey guys I am getting websocket information from external Api and it's give me json response in this way:

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

I am putting it into this struc

type main struct {

Name string `json:&quot;name&quot;`
Args []arg  `json:&quot;args&quot;`
}

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

and decode it with code

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

I am getting error

invalid character &#39;h&#39; after object key:value pair

I know that the error is result of text field value. Is there any good way to clean it up or tell the decoder to ignore content of text field?

答案1

得分: 4

应用程序正在解析包含子字符串&quot;text&quot;:&quot;&lt;a href=&quot;https的数据。这不是有效的JSON。错误消息在抱怨href中的h

由于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示例

英文:

The application is parsing data containing the substring &quot;text&quot;:&quot;&lt;a href=&quot;https. This is not valid JSON. The error message is complaining about the h in href.

Because the JSON value includes encoded JSON values, the application must decode in two steps:

type main struct {
  Name string   `json:&quot;name&quot;`
  Args []string `json:&quot;args&quot;`
}

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

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

playground example

huangapple
  • 本文由 发表于 2016年2月14日 09:02:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/35387215.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定