Skip to content

Методы итерации

Processor предоставляет различные методы для итерации массивов и объектов JSON.

Foreach

Сигнатура: func (p *Processor) Foreach(jsonStr string, fn func(key any, item *IterableValue), cfg ...Config)

Итерирует массив или объект JSON.

go
p.Foreach(data, func(key any, item *json.IterableValue) {
    fmt.Printf("Key: %v, Value: %v\n", key, item.GetData())
})

При итерации массива: key — индекс (int) При итерации объекта: key — имя ключа (string)

ForeachWithPath

Сигнатура: func (p *Processor) ForeachWithPath(jsonStr, path string, fn func(key any, item *IterableValue), cfg ...Config) error

Итерирует по указанному пути, возвращает ошибку.

go
err := p.ForeachWithPath(data, "items", func(key any, item *json.IterableValue) {
    fmt.Printf("[%v] %v\n", key, item.GetData())
})

Применимо для:

  • Итерации вложенных массивов
  • Итерации объектов по указанному пути

ForeachNested

Сигнатура: func (p *Processor) ForeachNested(jsonStr string, fn func(key any, item *IterableValue), cfg ...Config)

Рекурсивно итерирует все вложенные уровни.

go
p.ForeachNested(data, func(key any, item *json.IterableValue) {
    fmt.Printf("Ключ: %v, Значение: %v\n", key, item.GetData())
})

Пример данных:

json
{
  "user": {
    "name": "test",
    "profile": {
      "age": 25,
      "tags": ["a", "b"]
    }
  }
}

Вывод:

text
Ключ: user, Значение: map[string]any{...}
Ключ: name, Значение: test
Ключ: profile, Значение: map[string]any{...}
Ключ: age, Значение: 25
Ключ: tags, Значение: []any{...}
...

ForeachReturn

Сигнатура: func (p *Processor) ForeachReturn(jsonStr string, fn func(key any, item *IterableValue), cfg ...Config) (string, error)

Итерирует и возвращает исходный JSON (операция только для чтения).

go
result, err := p.ForeachReturn(data, func(key any, item *json.IterableValue) {
    // Обработка только для чтения
})

Подходит для сценариев, где после итерации нужно продолжить цепочечные операции.

ForeachWithError

Сигнатура: func (p *Processor) ForeachWithError(jsonStr, path string, fn func(key any, item *IterableValue) error, cfg ...Config) error

Итерирует по указанному пути, обратный вызов поддерживает возврат ошибки.

go
err := p.ForeachWithError(data, "items", func(key any, item *json.IterableValue) error {
    if item.GetInt("id") == 0 {
        return fmt.Errorf("invalid item at index %v", key)
    }
    return nil // Продолжить итерацию
})

ForeachNestedWithError

Сигнатура: func (p *Processor) ForeachNestedWithError(jsonStr string, fn func(key any, item *IterableValue) error, cfg ...Config) error

Рекурсивно итерирует все вложенные уровни, обратный вызов поддерживает возврат ошибки.

go
err := p.ForeachNestedWithError(data, func(key any, item *json.IterableValue) error {
    fmt.Printf("Ключ: %v, Значение: %v\n", key, item.GetData())
    return nil
})

ForeachWithPathAndIterator

Сигнатура: func (p *Processor) ForeachWithPathAndIterator(jsonStr, path string, fn func(key any, item *IterableValue, currentPath string) IteratorControl, cfg ...Config) error

Итерирует по указанному пути и предоставляет информацию о текущем пути. Использует IteratorControl для управления потоком итерации.

go
err := p.ForeachWithPathAndIterator(data, "items", func(key any, item *json.IterableValue, currentPath string) json.IteratorControl {
    fmt.Printf("Путь: %s, Ключ: %v\n", currentPath, key)
    if item.GetInt("id") == targetID {
        return json.IteratorBreak // Остановить итерацию
    }
    return json.IteratorNormal // Продолжить итерацию
})

ForeachWithPathAndControl

Сигнатура: func (p *Processor) ForeachWithPathAndControl(jsonStr, path string, fn func(key any, value any) IteratorControl, cfg ...Config) error

Итерирует исходные значения по указанному пути, использует IteratorControl для управления потоком.

go
err := p.ForeachWithPathAndControl(data, "items", func(key any, value any) json.IteratorControl {
    fmt.Printf("Ключ: %v, Значение: %v\n", key, value)
    return json.IteratorNormal
})

IterableValue

IterableValue в обратном вызове итерации предоставляет следующие возможности:

МетодОписание
GetData() anyПолучить текущее значение
Get(path string) anyПолучить значение по пути
GetString(key string) stringПолучить строковое значение
GetInt(key string) intПолучить целочисленное значение
GetFloat64(key string) float64Получить число с плавающей точкой
GetBool(key string) boolПолучить логическое значение
GetArray(key string) []anyПолучить значение массива
GetObject(key string) map[string]anyПолучить значение объекта
GetWithDefault(key string, defaultValue any) anyПолучить значение (со значением по умолчанию)
GetStringWithDefault(key string, defaultValue string) stringПолучить строку (со значением по умолчанию)
GetIntWithDefault(key string, defaultValue int) intПолучить целое число (со значением по умолчанию)
GetFloat64WithDefault(key string, defaultValue float64) float64Получить число с плавающей точкой (со значением по умолчанию)
GetBoolWithDefault(key string, defaultValue bool) boolПолучить логическое значение (со значением по умолчанию)
Exists(key string) boolПроверить, существует ли поле
IsNull(key string) boolПроверить, равно ли поле null
IsNullData() boolПроверить, равно ли текущее значение null
IsEmpty(key string) boolПроверить, пусто ли поле
IsEmptyData() boolПроверить, пусто ли текущее значение
Break() errorВозвращает сигнал ошибки для прерывания итерации
Release()Освобождает ресурсы обратно в пул объектов
ForeachNested(path string, fn func(key any, item *IterableValue))Рекурсивная итерация вложенных структур

Сравнение методов

МетодПараметр путиРекурсияВозвращаемое значениеОбратный вызов ошибки
ForeachНетНетНетНет
ForeachWithPathДаНетerrorНет
ForeachNestedНетДаНетНет
ForeachReturnНетНет(string, error)Нет
ForeachWithErrorДаНетerrorДа
ForeachNestedWithErrorНетДаerrorДа
ForeachWithPathAndIteratorДаНетerrorIteratorControl
ForeachWithPathAndControlДаНетerrorIteratorControl

Методы файловой итерации

Processor предоставляет методы для прямой итерации из файлов, подходящие для обработки больших JSON-файлов.

ForeachFile

Сигнатура: func (p *Processor) ForeachFile(filePath string, fn func(key any, item *IterableValue) error, cfg ...Config) error

Загружает JSON из файла и итерирует.

Параметры

ИмяТипОписание
filePathstringПуть к JSON-файлу
fnfunc(key any, item *IterableValue) errorОбратный вызов итерации
go
err := p.ForeachFile("data.json", func(key any, item *json.IterableValue) error {
    fmt.Printf("[%v] %v\n", key, item.GetData())
    return nil // Продолжить итерацию
})

ForeachFileWithPath

Сигнатура: func (p *Processor) ForeachFileWithPath(filePath, path string, fn func(key any, item *IterableValue) error, cfg ...Config) error

Загружает JSON из файла и итерирует по указанному пути.

go
// Итерировать только массив users
err := p.ForeachFileWithPath("data.json", ".users", func(key any, item *json.IterableValue) error {
    name := item.GetString("name")
    fmt.Printf("Пользователь: %s\n", name)
    return nil
})

ForeachFileChunked

Сигнатура: func (p *Processor) ForeachFileChunked(filePath string, chunkSize int, fn func(chunk []*IterableValue) error, cfg ...Config) (err error)

Построчно итерирует JSON-массив в файле, подходит для массовой обработки больших наборов данных.

Параметры

ИмяТипОписание
filePathstringПуть к JSON-файлу
chunkSizeintКоличество элементов в пакете (при <=0 по умолчанию 100)
fnfunc(chunk []*IterableValue) errorОбратный вызов пакетной обработки
go
// Обработка по 100 записей в пакете
err := p.ForeachFileChunked("large_data.json", 100, func(chunk []*json.IterableValue) error {
    // Массовая вставка в базу данных
    records := make([]Record, len(chunk))
    for i, item := range chunk {
        records[i] = Record{
            ID:   item.GetInt("id"),
            Name: item.GetString("name"),
        }
    }
    return db.BatchInsert(records)
})

Сценарии использования

  • Массовая вставка в базу данных
  • Пакетные вызовы API
  • Обработка больших файлов при ограниченной памяти

ForeachFileNested

Сигнатура: func (p *Processor) ForeachFileNested(filePath string, fn func(key any, item *IterableValue) error, cfg ...Config) error

Загружает JSON из файла и рекурсивно итерирует все вложенные структуры.

go
err := p.ForeachFileNested("config.json", func(key any, item *json.IterableValue) error {
    // Обход всех ключей и значений на всех уровнях
    fmt.Printf("Путь: %v, Тип: %T\n", key, item.GetData())
    return nil
})

Пример данных:

json
{
  "database": {
    "host": "localhost",
    "port": 5432,
    "pool": {
      "min": 5,
      "max": 20
    }
  }
}

Вывод:

text
Путь: database, Тип: map[string]any
Путь: host, Тип: string
Путь: port, Тип: float64
Путь: pool, Тип: map[string]any
Путь: min, Тип: float64
Путь: max, Тип: float64

Сравнение методов файловой итерации

МетодПараметр путиРекурсияПорциямиПодходящий сценарий
ForeachFileНетНетНетПростой обход файла
ForeachFileWithPathДаНетНетЦелевой обход
ForeachFileChunkedНетНетДаМассовая обработка, ограниченная память
ForeachFileNestedНетДаНетГлубокий обход всех узлов

Управление итерацией

Прерывание итерации

Возврат item.Break() в функции обратного вызова прерывает итерацию:

go
err := p.ForeachFile("data.json", func(key any, item *json.IterableValue) error {
    if item.GetInt("id") == targetID {
        // Цель найдена, остановить итерацию
        return item.Break()
    }
    return nil // Продолжить итерацию
})

Обработка ошибок

Возврат другой ошибки прерывает итерацию и возвращает эту ошибку:

go
err := p.ForeachFile("data.json", func(key any, item *json.IterableValue) error {
    if item.GetString("status") == "error" {
        return fmt.Errorf("обнаружена ошибочная запись: %v", key)
    }
    return nil
})
if err != nil {
    log.Printf("Итерация прервана: %v", err)
}

Связанные разделы