#json #golang
Как в golang работать с json? Читаю про стандартную библиотеку для json. Получается мне надо описывать кучу типов для каждого варианта? Или есть какой-нибудь пакет, чтоб он сам распарсивал, а я указывал, какое именно звено я хочу и получал результат? С WebSocket приходит строка, например, { "function": "Get_Me_List1", "data": { "param1": 1, "param2": 2 } } И в то же время будут и другие значения приходить. Я хочу сперва определить function и потом через case switch направить на соответствующую функцию с параметрами в программе go. Просто, как быть, если будут, например, и другие функции? Что-то типа { "function": "Values_Add", "data": { param_array:[1, 2, 3, 4, 5], param:777 } } Сперва мне нужно идентифицировать первое звено,т.е. узнать "function" и "data". Потом я передаю функции Values_Add(data) в go data (т.е параметры [1, 2, 3, 4, 5] и param:777) . Она должна так-же распарсить по своему типу, т.к. она будет принимать param_array и param .И потом уже работать со значениями. Спасибо Ainar-G /Nofate♦ Решение: type struct_json struct { Function string Data json.RawMessage } type get_Dir_Db_struct_json struct { Param1 string Param2 string } var var_struct_json = &struct_json{} var b = []byte(`{"function": "get_Dir_Db", "data": {"param1":"111","param2":"222"} }`) err := json.Unmarshal(b, var_struct_json) if err != nil { log.Println("error:", err) } switch var_struct_json.Function { case "get_Dir_Db": var var_get_Dir_Db_struct_json = &get_Dir_Db_struct_json{} err := json.Unmarshal(var_struct_json.Data, var_get_Dir_Db_struct_json) if err != nil { log.Println("error:", err) } log.Println("-",var_get_Dir_Db_struct_json.Param1) case "other": // ... default: log.Println("Функция,которую отослал клиент, не распознана- ", var_struct_json.Function) }
Ответы
Ответ 1
Если действительно работа с JSON-RPC, то см. ответ Nofate. В общем же случае для этого используется json.RawMessage. Пример из доков: type Color struct { Space string // Тип цвета, по нему распознаём, что делать дальше. Point json.RawMessage // Внутренний JSON, который будет парситься // в зависимости от типа. }Ответ 2
Похоже, что вы пытаетесь заново изобрести JSON-RPC Насколько я могу судить, это есть в Go из коробки: http://golang.org/pkg/net/rpc/jsonrpc/
Комментариев нет:
Отправить комментарий