Удаление персонажей Escape из Marshalled Struct Golang - PullRequest
0 голосов
/ 10 июля 2019

Формат моего вывода JSON после того, как я упорядочил структуру, содержит много escape-символов и двойных кавычек.

Я пытался использовать кодировщик Marshalling, 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": "debug", "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": "debug", "time": "2019-07-10T20: 12: 09Z", "message": "{" idx ":" 8931741865 ","mci_idx ":" 107265043" , "канал": "WPVIDT" ...} "}

1 Ответ

1 голос
/ 11 июля 2019

Для удаления двойных кавычек вы можете использовать strconc.Unquote

Было бы замечательно увидеть пример ряда данных, чтобы увидеть, если что-то еще не хватает.

Но из того, что доступно здесь, если в строке есть кавычки, json.Marshal не удалит их автоматически. Вы можете удалить кавычки, используя вышеуказанную команду.

Посмотрите на этот пример для Unquote.

Вероятно, вы можете просто написать один метод в структуре ChannelData, который будет заключать в кавычки каждое поле.

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