#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/
Комментариев нет:
Отправить комментарий