Задать вопрос

Как в golang работать с json?

Как в 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]"}`
  • Вопрос задан
  • 5493 просмотра
Подписаться 6 Оценить Комментировать
Решения вопроса 3
@eoffsock
Кодер (Rails)
Можно распарсить json любой структуры в json.RawMessage

var raw json.RawMessage
err := json.Unmarshal(data, &raw)


Но в конечном итоге все придет к фиксированной схеме. Ну, разве что вы парсите список - тогда из него можно будет получить слайс или что там в Go для списков используется - не объявляя явно структуру.
Ответ написан
Можно использовать 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)
Ответ написан
Комментировать
@TwoRS Автор вопроса
Спасибо. Чуть модифицировал, конкретно под задачу

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)
  }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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