cpp

Формат JSON: преобразование объекта в строку и обратно

Структуру можно преобразовать в строку в формате JSON (JavaScript Object Notation), а затем выполнить обратное преобразование. При использовании формата JSON следует учитывать следующие моменты:

  • данные представлены в виде строки в кодировке UTF-8;
  • имена свойств и значения в виде строки заключаются в двойные кавычки;
  • значением свойства не может быть функция, только данные различных типов: числа, строки, массивы и объекты (включая значение null);
  • завершающие запятые запрещены.

Прежде чем выполнять преобразование нужно настроить правила для каждого публичного поля структуры. Правила задаются с помощью тега следующего формата:

`json:"[<Название свойства>][,string][,omitempty]"`

Параметр <Название свойства> задает название свойства, которое будет использоваться вместо названия поля. Если тег не задан или параметр равен пустой строке, то названием свойства будет название поля:

Id       int    `json:"id"`
Name     string `json:""`

Результат:

"id":10,"Name":"Иван"

Если в параметре <Название свойства> указан символ -, то поле не попадет в итоговую строку:

Password string `json:"-"`

Если в параметре <Название свойства> указан символ - и запятая, то поле будет иметь название -:

Password string `json:"-,"`

Результат:

"-":"123"

Если указан параметр ,string, то значение будет указано внутри кавычек:

Age      int    `json:"age,string"`

Результат:

"age":"25"

Если указан параметр ,omitempty, то поле не попадет в итоговую строку, если оно имеет нулевое значение (nil, false, пустая строка и др.):

Arr1     []int  `json:"arr1"`
Arr2     []int  `json:"arr2,omitempty"`
Arr3     []int  `json:"arr3"`

Результат:

"arr1":null,"arr3":[1,2,3]

Выполнить преобразование позволяет функция Marshal() из пакета encoding/json. Формат функции:

json.Marshal(v interface{}) ([]byte, error)

Функция возвращает два значения. Через первое значение доступен байтовый слайс со значением в формате JSON. Через второе значение можно получить сообщение об ошибке или значение nil, если ошибки не возникло.

Объявим структуру:

type MyStruct struct {
   Id       int    `json:"id"`
   Name     string `json:""`
   Password string `json:"-"`
   Age      int    `json:"age,string"`
   Arr1     []int  `json:"arr1"`
   Arr2     []int  `json:"arr2,omitempty"`
   Arr3     []int  `json:"arr3"`
}

Теперь создадим экземпляр структуры и выполним преобразование:

// import "encoding/json"
obj := MyStruct{Id: 10, Name: "Иван", Password: "123",
                Age: 25, Arr3: []int{1, 2, 3}}
b, err := json.Marshal(obj)
fmt.Println(err) // <nil>
fmt.Println(string(b))
// {"id":10,"Name":"Иван","age":"25","arr1":null,"arr3":[1,2,3]}

Вместо функции Marshal() можно использовать функцию MarshalIndent(). Формат функции:

json.MarshalIndent(v interface{}, prefix string,
                   indent string) ([]byte, error)

Каждое свойство будет располагаться на отдельной строке, которая начинается с фрагмента prefix, после которого идет один или несколько (в зависимости от уровня вложенности) фрагментов indent:

obj := MyStruct{Id: 10, Name: "Иван", Password: "123",
                Age: 25, Arr3: []int{1, 2, 3}}
b, err := json.MarshalIndent(obj, "", "   ")
fmt.Println(err) // <nil>
fmt.Println(string(b))

Результат:

{
   "id": 10,
   "Name": "Иван",
   "age": "25",
   "arr1": null,
   "arr3": [
      1,
      2,
      3
   ]
}

Выполнить обратную операцию позволяет функция Unmarshal(). Формат функции:

json.Unmarshal(data []byte, v interface{}) error

В первом параметре указывается байтовый слайс со значением в формате JSON. Во втором параметре нужно передать адрес экземпляра структуры. Если возникла ошибка, то ее описание возвращается из функции. Пример:

b := []byte(`{"id":10,"Name":"Иван","age":"25",` +
            `"arr1":null,"arr3":[1,2,3]}`)
obj := MyStruct{}
err := json.Unmarshal(b, &obj)
fmt.Println(err) // <nil>
fmt.Printf("%+v\n", obj)
// {Id:10 Name:Иван Password: Age:25 Arr1:[] Arr2:[] Arr3:[1 2 3]}

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp