dongxing1853 2016-02-14 01:02
浏览 139
已采纳

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

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

 `{"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}}"]}`

I am putting it into this struc

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"`
}

and decode it with code

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

I am getting error

invalid character 'h' 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条回答 默认 最新

  • dongxiangshen7916 2016-02-14 03:35
    关注

    The application is parsing data containing the substring "text":"<a href="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:"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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)