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 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?