Какой подход к парсингу JSON выбрать в Golang?

Есть данные в 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 строку? И уже её потом парсить.
  • Вопрос задан
  • 3524 просмотра
Решения вопроса 1
@om1058
Можно парсить по частям. Стандартный пример из документации: https://golang.org/pkg/encoding/json/#example_RawM...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ivahaev
Программист, связист и просто хороший человек
Есть ещё классный вариант — парсить json вот такой штукой:
https://github.com/buger/jsonparser
или такой
https://github.com/tidwall/gjson

Писанины больше, но быстрее и экономнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы