Есть данные в JSON, например два варианта:
{"name": "Player", "id": 1, "method": "server", "params": {"login": "Vasya", "pass": "****"}}
{"name": "Player", "id": 2, "method": "game", "params":{"action":"move","player":"Vasya"}}
Суть в том, что поля name, id и method - всегда должны быть, но params меняется от метода и прочее.
И получается вопрос как правильно это распарсить в Go?
1й вариант. В лоб.
Создать две структуры с обязательными параметрами и структуру со всевозможными параметрами и декодировать:
type Message struct {
Name string `json:"name"`
Id int `json:"id"`
Method string `json:"method"`
Params Params `json:"params"`
}
type Params struct {
Action string `json:"action"`
Player string `json:"player"`
Login string `json:"login"`
Pass string `json:"pass"`
}
d := json.NewDecoder(conn) //Тут коннект от TCP
var msg Message
err := d.Decode(&msg)
В принципе работает, но отсутствующие поля заменяются дефолтными значениями и жрут память.
Как-то не очень красиво.
2й вариант. С помощью interface. Не знаю как реализовать до конца.
Сделать структуру для обязательных полей и interface для params.
type Message struct {
Name string `json:"name"`
Id int `json:"id"`
Method string `json:"method"`
Params interface{} `json:"params"`
}
d := json.NewDecoder(conn) //Тут коннект от TCP
var msg Message
err := d.Decode(&msg)
Всё получается с дефолтными значениями, но interface превращается в map
//Вывод структуры после декодирования
Player 2 game map[action:move player:Vasya]
а хотелось бы его как-то собрать потом в struct, как бы ещё раз декодировать его в нужную структуру.
Вопрос как реализовать до конца это?
Т.е. или interface этот превратить в struct или map уже получившийся превратить в struct.
Ну или возможно, есть ещё решения.
Ещё как вариант.
Можно ли как то закинуть params в отдельную json строку? И уже её потом парсить.