← Library JSONDeterministic

JSONExtractOp

Extracts a value from a JSON string using a dot-separated path.

Inputs

FieldTypeDescription
JSON*stringJSON-encoded string to navigate
Path*stringDot-separated path (numeric segments index arrays)

Outputs

FieldTypeDescription
ValuestringJSON-encoded leaf value, or empty string if path not found

Dot-path navigation. Use numeric segments to index arrays: meals.0.name reads meals[0].name. The returned value is JSON-encoded — a string field includes its quotes.

Typical Use Cases

  • Extracting fields from API responses
  • Navigating nested JSON structures
  • Pulling array elements by index from a fetch result

Complete Runnable Example

Extracts a user's name from a nested JSON API response payload using a dot path.

main.go
package main

import (
	"context"
	"encoding/json"
	"log"
	"os"
	"time"

	"github.com/akennis/sparsi-go/library"
	_ "github.com/akennis/dagor/operator/builtin"

	"github.com/panjf2000/ants/v2"
	"github.com/akennis/dagor"
	"github.com/akennis/dagor/graph"
)

func main() {
	payload := `{"user":{"name":"Alice","tier":"gold"},"order":{"id":9912,"items":["widget","gadget"]}}`
	path := "user.name"

	library.RegisterConst("json_payload", payload)
	library.RegisterConst("json_path", path)

	g, err := graph.NewBuilder("json_extract_demo").
		Vertex("src_json").Op("json_payload").Output("Result", "json_wire").
		Vertex("src_path").Op("json_path").Output("Result", "path_wire").
		Vertex("extract").Op("JSONExtractOp").
		Input("JSON", "json_wire").
		Input("Path", "path_wire").
		Output("Value", "extracted").
		Build()
	if err != nil {
		log.Fatalf("build: %v", err)
	}

	pool, err := ants.NewPool(4)
	if err != nil {
		log.Fatalf("pool: %v", err)
	}
	defer pool.Release()

	eng, err := dagor.NewEngine(g, pool)
	if err != nil {
		log.Fatalf("engine: %v", err)
	}

	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
	defer cancel()

	if err := eng.Run(ctx); err != nil {
		log.Fatalf("run: %v", err)
	}

	out := map[string]any{"path": path}
	if raw, ok := eng.GetOutput("extracted"); ok {
		out["value"] = *raw.(*string)
	}
	enc := json.NewEncoder(os.Stdout)
	enc.SetIndent("", "  ")
	enc.Encode(out)
}