Documentation
¶
Overview ¶
Package jsonmerge implements RFC 7386 JSON Merge Patch for Go.
It supports structs, map[string]any, []byte, and string documents. Use WithMutate(true) to allow in-place updates when the caller prefers speed over preserving map inputs.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( // ErrMarshal indicates JSON marshaling failed. ErrMarshal = errors.New("marshal failed") // ErrUnmarshal indicates JSON unmarshaling failed. ErrUnmarshal = errors.New("unmarshal failed") // ErrConversion indicates type conversion between document types failed. ErrConversion = errors.New("type conversion failed") )
Functions ¶
func Generate ¶
Generate returns a merge patch that transforms source into target. If it fails, the error matches ErrMarshal, ErrUnmarshal, or ErrConversion.
Example ¶
package main
import (
"fmt"
"log"
"github.com/kaptinlin/jsonmerge"
)
func main() {
source := map[string]any{"name": "John", "age": 30, "city": "NYC"}
target := map[string]any{"name": "Jane", "age": 30}
patch, err := jsonmerge.Generate(source, target)
if err != nil {
log.Fatal(err)
}
fmt.Println(patch["name"])
fmt.Println(patch["city"])
}
Output: Jane <nil>
func Valid ¶
Valid reports whether patch is accepted as a JSON Merge Patch value.
Example ¶
package main
import (
"fmt"
"github.com/kaptinlin/jsonmerge"
)
func main() {
fmt.Println(jsonmerge.Valid(map[string]any{"name": "Jane"}))
fmt.Println(jsonmerge.Valid([]byte(`{"name": "Jane"}`)))
fmt.Println(jsonmerge.Valid([]byte(`{invalid}`)))
}
Output: true true false
Example (RawString) ¶
package main
import (
"fmt"
"github.com/kaptinlin/jsonmerge"
)
func main() {
fmt.Println(jsonmerge.Valid("raw string"))
fmt.Println(jsonmerge.Valid([]byte(`{invalid}`)))
}
Output: true false
Types ¶
type Document ¶
type Document interface {
any
}
Document is the type constraint used by Merge, Generate, and Valid.
type Option ¶
type Option func(*Options)
Option configures Options.
func WithMutate ¶
WithMutate allows Merge to update map targets in place. The default is false.
type Result ¶
type Result[T Document] struct { Doc T }
Result holds a merged document.
func Merge ¶
Merge applies patch to target according to RFC 7386. By default it preserves map targets; use WithMutate(true) to update them in place. If it fails, the error matches ErrMarshal, ErrUnmarshal, or ErrConversion.
Example ¶
package main
import (
"fmt"
"log"
"github.com/kaptinlin/jsonmerge"
)
func main() {
target := map[string]any{"name": "John", "age": 30}
patch := map[string]any{"age": 31}
result, err := jsonmerge.Merge(target, patch)
if err != nil {
log.Fatal(err)
}
fmt.Println(result.Doc["name"])
fmt.Println(result.Doc["age"])
}
Output: John 31
Example (WithMutate) ¶
package main
import (
"fmt"
"log"
"github.com/kaptinlin/jsonmerge"
)
func main() {
target := map[string]any{"name": "John", "age": 30}
patch := map[string]any{"age": 31}
result, err := jsonmerge.Merge(target, patch, jsonmerge.WithMutate(true))
if err != nil {
log.Fatal(err)
}
fmt.Println(result.Doc["age"])
}
Output: 31
Directories
¶
| Path | Synopsis |
|---|---|
|
examples
|
|
|
json-bytes-merge
command
Package main demonstrates byte-slice JSON Merge Patch usage.
|
Package main demonstrates byte-slice JSON Merge Patch usage. |
|
json-string-merge
command
Package main demonstrates string-based JSON Merge Patch usage.
|
Package main demonstrates string-based JSON Merge Patch usage. |
|
map-merge
command
Package main demonstrates map-based JSON Merge Patch usage.
|
Package main demonstrates map-based JSON Merge Patch usage. |
|
struct-merge
command
Package main demonstrates struct-based JSON Merge Patch usage.
|
Package main demonstrates struct-based JSON Merge Patch usage. |