从编组的结构Golang中删除转义符

时间:2019-07-10 20:31:37

标签: json go encoding marshalling

编组结构后,JSON输出的格式包含很多转义符和双引号。

我尝试使用编组器,编组,RawMessages来强制删除字符串的一部分。

data := ChannelData{}
if err := rows.Scan(&data.Idx, &data.MciIdx, &data.Channel, &data.MatchIdx, &data.MatchCx, &data.StartTs, &data.EndTs, &data.Len, &data.MatchStartTs, &data.MatchEndTs, &data.MatchLen, &data.Happened, &data.Instance); err != nil {
log.Printf("%+v\n", rows)
log.Error().Err(err).Msg("unable to scan mysql data into struct")
continue
}

jsonD, err := json.Marshal(&data)
if err != nil {
log.Error().Err(err).Msg("cannot marshal data")
}
log.Debug().Msg(string(jsonD))

type ChannelData struct {
    Idx          string `json:"idx,string"`
    MciIdx       string `json:"mci_idx,string"`
    Channel      string `json:"channel,string"`
    MatchIdx     string `json:"match_idx,string"`
    MatchCx      string `json:"match_cx,string"`
    StartTs      string `json:"start_ts,string"`
    EndTs        string `json:"end_ts,string"`
    Len          string `json:"len,string"`
    MatchStartTs string `json:"match_start_ts,string"`
    MatchEndTs   string `json:"match_end_ts,string"`
    MatchLen     string `json:"match_len,string"`
    Happened     string `json:"happened,string"`
    Instance     string `json:"instance,string"`
}

我得到:

{“ level”:“调试”,“ time”:“ 2019-07-10T20:12:09Z”,“ message”:“ {\” idx \“:\” \\“ 8931741865 \\” \ “,\” mci_idx \“:\” \\“ 107265043 \\” \“,\”频道\“:\” \\“ WPVIDT \\” \“,\” match_idx \“:\” \\“ 36028797060807935 \\“ \”,\“ match_cx \”:\“ \\” \\“ \”,\“ start_ts \”:\“ \\” 2019-07-10 17:57:59 \\“ \”, \“ end_ts \”:\“ \\” 2019-07-10 17:58:14 \\“ \”,\“ len \”:\“ \\” 00:00:15 \\“ \”,\ “ match_start_ts \”:\“ \\” 2019-06-05 07:14:52 \\“ \”,\“ match_end_ts \”:\“ \\” 2019-06-05 07:15:08 \\“ \“,\” match_len \“:\” \\“ 00:00:16 \\” \“,\”发生了\“:\” \\“ 2019-07-10 17:58:16 \\” \ “,\” instance \“:\” \\“ 172.17.65.80 \\” \“}”}

我希望它采用JSON格式:

{“ level”:“调试”,“ time”:“ 2019-07-10T20:12:09Z”,“ message”:“ {” idx“:” 8931741865“,” mci_idx“:” 107265043“, “ channel”:“ WPVIDT” ...}“}

1 个答案:

答案 0 :(得分:1)

要删除双引号,可以使用strconc.Unquote

很高兴看到一行数据的示例,看看是否还有其他缺失。

但是从这里可用的内容中,如果字符串json.Marshal中有引号,将不会自动删除它们。您可以使用上述命令删除引号。

Look at This Example for Unquote

您可能只需要在ChannelData结构上编写一个方法即可取消引用每个字段。

func (c *ChannelData) unquote() {
  c.Idx = strconv.Unquote(c.Idx)
.
.
.
}