РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1135 of 1593 menu

Метод json.Decoder.Token

Метод json.Decoder.Token читает следующий JSON-токен из входного потока. Он возвращает токен в виде пустого интерфейса any, а также ошибку, если она возникла. Токен может быть одним из следующих типов: json.Delim (для скобок [, ], {, }), string, float64, bool, nil или json.Number (если включён режим UseNumber). Этот метод полезен, когда нужно обрабатывать JSON-данные потоково, без полной распаковки в структуру. Первый вызов Token начинает чтение с самого начала документа, а каждый последующий вызов перемещает курсор на следующий токен.

Синтаксис

func (dec *json.Decoder) Token() (any, error)

Метод вызывается на экземпляре json.Decoder, возвращает прочитанный токен и ошибку. При достижении конца документа возвращается ошибка io.EOF.

Пример ⁅n="sect"⁆

Давайте последовательно прочитаем все токены из простого JSON-объекта:

package main import ( "encoding/json" "fmt" "strings" ) func main() { data := `{"name": "John", "age": 30, "active": true}` dec := json.NewDecoder(strings.NewReader(data)) for { token, err := dec.Token() if err != nil { break } fmt.Printf("Token: %v (%T)\n", token, token) } }

Результат выполнения кода:

Token: { (json.Delim) Token: name (string) Token: John (string) Token: age (string) Token: 30 (float64) Token: active (string) Token: true (bool) Token: } (json.Delim)

Пример ⁅n="sect"⁆

Обработаем массив с числами, используя Token и проверяя тип каждого токена:

package main import ( "encoding/json" "fmt" "strings" ) func main() { data := `[10, 20.5, 30]` dec := json.NewDecoder(strings.NewReader(data)) for { token, err := dec.Token() if err != nil { break } switch v := token.(type) { case json.Delim: fmt.Printf("Delimiter: %s\n", v) case float64: fmt.Printf("Number: %.1f\n", v) default: fmt.Printf("Other: %v\n", v) } } }

Результат выполнения кода:

Delimiter: [ Number: 10.0 Number: 20.5 Number: 30.0 Delimiter: ]

Пример ⁅n="sect"⁆

Используем Token для проверки наличия следующего токена без его чтения — для этого применяем метод More:

package main import ( "encoding/json" "fmt" "strings" ) func main() { data := `{"x": 1, "y": 2}` dec := json.NewDecoder(strings.NewReader(data)) // Пропускаем открывающую скобку dec.Token() for dec.More() { key, _ := dec.Token() value, _ := dec.Token() fmt.Printf("%s: %v\n", key, value) } }

Результат выполнения кода:

x: 1 y: 2

Смотрите также

  • метод json.Decoder.Decode,
    который декодирует весь JSON сразу в структуру
  • метод json.Decoder.More,
    который проверяет наличие следующего токена
  • функцию json.NewDecoder,
    которая создаёт новый декодер из io.Reader
  • функцию json.Unmarshal,
    которая декодирует JSON из байтового слайса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить