Как в golang работать с json?
Читаю про стандартную библиотеку для json.
Получается мне надо описывать кучу типов для каждого варианта?
Или есть какой-нибудь пакет, что б он сам распарсивал, а я указывал, какое именно звено я хочу и получал результат?
С WebSocket приходит строка, например, `{function:"Get_Me_List1",data:"{param1:1,param2:2}"}`
И в то же время будут и другие значения приходить.
Я хочу сперва определить function и потом через case switch направить на соответствующую функцию с параметрами в программе go.
Просто, как быть, если будет, например и другие функции ? Что-то типа `{function:"Values_Add",data:"[1,2,3,4,5]"}`
Можно распарсить json любой структуры в json.RawMessage
var raw json.RawMessage
err := json.Unmarshal(data, &raw)
Но в конечном итоге все придет к фиксированной схеме. Ну, разве что вы парсите список - тогда из него можно будет получить слайс или что там в Go для списков используется - не объявляя явно структуру.
Вы немного не правы. У топикпастера не валидный JSON, будет сообщение об ошибке
error: invalid character 'f' looking for beginning of object key string
А raw будет иметь значение []
Вопрос - как распарсить валидный JavaScript Object но при этом не валидный JSON как у топикпастера? У самого такая задача сейчас. Буду признателен если кто-то подскажет.
Можно использовать interface{} как тип результата. В этом случае функция Unmarshal сама ставит наиболее подходящие типы. Ну и еще по-моему накладываются определенные требования на JSON - парсинг имен полей без кавычек дает ошибку. А вот так вот работает
type test interface{}
var itest test
var jtest = []byte(`{"function":"Get_Me_List1","data": {
"param1":1,"param2":2}}`)
err := json.Unmarshal(jtest, &itest)
if err != nil {
fmt.Println("error:", err )
}
fmt.Println(itest)