데이터 수정 메서드
Processor 는 데이터 수정 메서드를 제공하며, 모든 메서드는 수정된 JSON 문자열을 반환합니다. 삭제 메서드는 삭제 작업을 참고하세요.
Set
시그니처: func (p *Processor) Set(jsonStr, path string, value any, cfg ...Config) (result string, err error)
지정된 경로에 값을 설정하고, 수정된 JSON 문자열을 반환합니다.
result, err := p.Set(data, "user.name", "NewName")다양한 타입의 값 설정을 지원합니다:
// 문자열
result, _ := p.Set(data, "user.name", "CyberGo")
// 숫자
result, _ = p.Set(data, "user.age", 25)
// 불리언
result, _ = p.Set(data, "user.active", true)
// 객체
result, _ = p.Set(data, "user.profile", map[string]any{
"bio": "Developer",
"location": "China",
})
// 배열
result, _ = p.Set(data, "items", []any{"a", "b", "c"})SetMultiple
시그니처: func (p *Processor) SetMultiple(jsonStr string, updates map[string]any, cfg ...Config) (string, error)
여러 경로의 값을 배치로 설정하고, 수정된 JSON 문자열을 반환합니다.
result, err := p.SetMultiple(data, map[string]any{
"user.name": "CyberGo",
"user.age": 25,
"user.active": true,
})SetCreate
시그니처: func (p *Processor) SetCreate(jsonStr, path string, value any, cfg ...Config) (string, error)
값을 설정하고 존재하지 않는 중간 경로를 자동으로 생성합니다. Config.CreatePaths = true의 Set과 동일합니다.
// 중간 경로 user.profile 이 존재하지 않으면 자동으로 생성
result, err := p.SetCreate(data, "user.profile.bio", "Developer")
// {"user":{"profile":{"bio":"Developer"}}}SetMultipleCreate
시그니처: func (p *Processor) SetMultipleCreate(jsonStr string, updates map[string]any, cfg ...Config) (string, error)
여러 값을 배치로 설정하고 중간 경로를 자동으로 생성합니다.
result, err := p.SetMultipleCreate(data, map[string]any{
"user.profile.bio": "Developer",
"user.profile.location": "China",
})체인 수정
수정 메서드는 체인 호출을 지원합니다:
processor, _ := json.New()
result1, _ := processor.Set(data, "user.name", "CyberGo")
result2, _ := processor.Set(result1, "user.version", "1.0.0")
finalResult, _ := processor.Delete(result2, "user.temporary")Processor 병합 메서드
Processor 는 패키지 레벨 MergeJSON, MergeMany, CompareJSON에 대응하는 인스턴스 메서드를 제공합니다.
Processor.MergeJSON
시그니처: func (p *Processor) MergeJSON(json1, json2 string, cfg ...Config) (string, error)
cfg 에서 옵션을 파싱하여 (cfg 생략 시 프로세서 자체 설정이 아닌 DefaultConfig 사용 — 프로세서를 커스텀 MergeMode 로 생성한 경우, 해당 모드를 적용하려면 cfg 를 명시적으로 전달해야 함), Config.MergeMode에 따라 두 객체를 깊이 병합한 뒤 이 프로세서로 결과를 다시 인코딩합니다.
패키지 레벨 함수와 마찬가지로 Processor.MergeJSON은 보안 검증을 수행하지 않습니다 — 디코딩, 깊은 병합, 재인코딩만 하는 구조적 도구입니다. 보안 검증이 필요하면 CompareJSON을 사용하세요 (항상 보안 검증 수행; cfg 전달 시 cfg 에 따라, 그렇지 않으면 프로세서 자체 설정에 따라).
p, err := json.New()
if err != nil {
panic(err)
}
defer p.Close()
// 통합 병합 (기본값)
result, err := p.MergeJSON(base, override)
// 교집합 병합
cfg := json.DefaultConfig()
cfg.MergeMode = json.MergeIntersection
result, err = p.MergeJSON(base, override, cfg)Processor.MergeMany
시그니처: func (p *Processor) MergeMany(jsons []string, cfg ...Config) (string, error)
MergeJSON으로 슬라이스를 왼쪽에서 오른쪽으로 접으며, 병합 전략은 Config.MergeMode가 결정합니다 (기본값 MergeUnion). JSON 문자열이 2 개 미만이면 오류를 반환하고, 어느 병합 단계가 실패하면 실패한 인덱스를 담은 오류를 반환합니다.
result, err := p.MergeMany([]string{config1, config2, config3})Processor.CompareJSON
시그니처: func (p *Processor) CompareJSON(json1, json2 string, cfg ...Config) (bool, error)
두 JSON 문자열이 같은지 비교합니다 (숫자 정규화, 키 순서 무관).
패키지 레벨 CompareJSON 과의 차이
패키지 레벨 CompareJSON은 cfg 가 없을 때 보안 검증을 수행하지 않고 양쪽을 encoding/json으로 마샬링합니다; Processor 메서드는 항상 보안 검증을 수행 (cfg 전달 시 cfg 에 따라, 그렇지 않으면 프로세서 자체 설정에 따라) 하며, 라이브러리 인코더로 양쪽을 대칭 마샬링하여 설정된 인코딩 (예: EscapeHTML) 이 대칭적으로 적용되게 합니다.
equal, err := p.CompareJSON(a, b)
equal, err = p.CompareJSON(a, b, json.SecurityConfig())