Страницы

Поиск по вопросам

среда, 25 декабря 2019 г.

Как декодировать разнотипный JSON в Go?

#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/

Комментариев нет:

Отправить комментарий