Skip to content

패키지 레벨 반복 함수

Processor 인스턴스를 생성하지 않고 직접 호출할 수 있는 반복 함수입니다. Processor 반복 메서드와 일대일로 대응됩니다 (이중 계층 설계).

Foreach

시그니처: func Foreach(jsonStr string, fn func(key any, item *IterableValue), cfg ...Config)

JSON 배열 또는 객체를 순회합니다.

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

배열 순회 시: key 는 인덱스 (int) 객체 순회 시: key 는 키 이름 (string)

ForeachWithPath

시그니처: func ForeachWithPath(jsonStr, path string, fn func(key any, item *IterableValue), cfg ...Config) error

경로를 따라 순회하며, 오류를 반환합니다.

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

적용 사례:

  • 중첩 배열 순회
  • 지정된 경로의 객체 순회

ForeachNested

시그니처: func ForeachNested(jsonStr string, fn func(key any, item *IterableValue), cfg ...Config)

모든 중첩 수준을 재귀적으로 순회합니다.

go
json.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 ForeachReturn(jsonStr string, fn func(key any, item *IterableValue), cfg ...Config) (string, error)

JSON 데이터를 순회하며 콜백으로 각 요소에 접근하고, 다시 직렬화한 JSON 문자열을 반환합니다. 콜백은 GetData()를 통해 map/slice를 수정할 수 있으며, 수정 사항은 반환값에 반영됩니다.

go
result, err := json.ForeachReturn(data, func(key any, item *json.IterableValue) {
    // item.GetData() 로 요소에 접근/수정 가능
})

순회 후 체인 작업을 이어가야 하는 시나리오에 적합합니다.

ForeachWithError

시그니처: func ForeachWithError(jsonStr, path string, fn func(key any, item *IterableValue) error, cfg ...Config) error

경로를 따라 순회하며, 콜백이 오류를 반환할 수 있습니다.

go
err := json.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 ForeachNestedWithError(jsonStr string, fn func(key any, item *IterableValue) error, cfg ...Config) error

모든 중첩 수준을 재귀적으로 순회하며, 콜백이 오류를 반환할 수 있습니다.

go
err := json.ForeachNestedWithError(data, func(key any, item *json.IterableValue) error {
    fmt.Printf("키: %v, 값: %v\n", key, item.GetData())
    return nil
})

ForeachWithPathAndIterator

시그니처: func ForeachWithPathAndIterator(jsonStr, path string, fn func(key any, item *IterableValue, currentPath string) IteratorControl, cfg ...Config) error

경로를 따라 순회하며 현재 경로 정보를 제공합니다. IteratorControl로 반복 흐름을 제어합니다.

go
err := json.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 ForeachWithPathAndControl(jsonStr, path string, fn func(key any, value any) IteratorControl, cfg ...Config) error

경로를 따라 원시 값을 순회하며, IteratorControl로 흐름을 제어합니다.

go
err := json.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객체 값 가져오기
Exists(key string) bool필드 존재 여부 확인
IsNull(key string) bool / IsNullData() boolnull 여부 확인
IsEmpty(key string) bool / IsEmptyData() bool빈 값 여부 확인
Break() error반복 중단 오류 신호 반환
Release()객체 풀로 리소스 반환

메서드 비교

메서드경로 매개변수재귀반환값오류 콜백
Foreach없음아니오없음아니오
ForeachWithPath있음아니오error아니오
ForeachNested없음없음아니오
ForeachReturn없음아니오(string, error)아니오
ForeachWithError있음아니오error
ForeachNestedWithError없음error
ForeachWithPathAndIterator있음아니오errorIteratorControl
ForeachWithPathAndControl있음아니오errorIteratorControl

파일 반복 함수

패키지 레벨에서 파일로부터 직접 반복하는 함수를 제공합니다. 대용량 JSON 파일 처리에 적합하며, Processor 파일 반복 메서드와 대응됩니다.

ForeachFile

시그니처: func ForeachFile(filePath string, fn func(key any, item *IterableValue) error, cfg ...Config) error

파일에서 JSON 을 로드하여 반복합니다.

매개변수

이름타입설명
filePathstringJSON 파일 경로
fnfunc(key any, item *IterableValue) error반복 콜백
go
err := json.ForeachFile("data.json", func(key any, item *json.IterableValue) error {
    fmt.Printf("[%v] %v\n", key, item.GetData())
    return nil // 반복 계속
})

ForeachFileWithPath

시그니처: func ForeachFileWithPath(filePath, path string, fn func(key any, item *IterableValue) error, cfg ...Config) error

파일에서 JSON 을 로드하고 경로를 따라 반복합니다.

go
// users 배열만 반복
err := json.ForeachFileWithPath("data.json", ".users", func(key any, item *json.IterableValue) error {
    name := item.GetString("name")
    fmt.Printf("사용자: %s\n", name)
    return nil
})

ForeachFileChunked

시그니처: func ForeachFileChunked(filePath string, chunkSize int, fn func(chunk []*IterableValue) error, cfg ...Config) error

파일 내 JSON 배열을 청크 단위로 반복합니다. 대용량 데이터셋의 배치 처리에 적합합니다.

매개변수

이름타입설명
filePathstringJSON 파일 경로
chunkSizeint배치당 처리 수량 (≤0 이면 기본값 100)
fnfunc(chunk []*IterableValue) error배치 처리 콜백
go
// 한 번에 100 개 레코드씩 처리
err := json.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 ForeachFileNested(filePath string, fn func(key any, item *IterableValue) error, cfg ...Config) error

파일에서 JSON 을 로드하고 모든 중첩 구조를 재귀적으로 반복합니다.

go
err := json.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없음아니오모든 노드 깊이 순회

반복 제어

IteratorControl 상수

ForeachWithPathAndControlForeachWithPathAndIteratorIteratorControl을 반환하여 반복 흐름을 제어합니다 (상수 정의는 반복기 타입 참조):

상수설명
IteratorNormal정상적으로 반복 계속
IteratorContinue현재 항목 건너뛰고 반복 계속
IteratorBreak반복 중단

반복 중단

오류 콜백에서 item.Break()를 반환하면 반복을 중단할 수 있습니다:

go
err := json.ForeachFile("data.json", func(key any, item *json.IterableValue) error {
    if item.GetInt("id") == targetID {
        // 대상을 찾음, 반복 중단
        return item.Break()
    }
    return nil // 반복 계속
})

오류 처리

다른 오류를 반환하면 반복이 중단되고 해당 오류가 반환됩니다:

go
err := json.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)
}

관련 문서