Skip to content

examples/jsmn-demo/main.go

:material-github: View on GitHub · 67 lines · live source, included at build time

package main

import (
    "fmt"
    "log"

    "github.com/alikatgh/safeheaders-go/jsmn-go"
)

func main() {
    // Example JSON data
    json := []byte(`{
        "name": "SafeHeaders-Go",
        "version": "1.0",
        "features": ["fast", "safe", "concurrent"],
        "stats": {
            "modules": 9,
            "stars": 100
        }
    }`)

    fmt.Print("=== JSON Tokenizer Demo ===\n\n")
    fmt.Printf("Input JSON:\n%s\n\n", string(json))

    // Parse JSON
    p := jsmngo.NewParser(100)
    n, err := p.Parse(json)
    if err != nil {
        log.Fatalf("Parse error: %v", err)
    }

    fmt.Printf("✓ Parsed %d tokens\n\n", n)

    // Display tokens
    tokens := p.Tokens()
    for i, tok := range tokens {
        value := string(json[tok.Start:tok.End])
        typeStr := tokenTypeString(tok.Type)
        fmt.Printf("Token %2d: %-10s | %s\n", i, typeStr, value)
    }

    // Parallel parsing demo (for large JSON)
    fmt.Print("\n=== Parallel Parsing Demo ===\n\n")

    largeJSON := []byte(`[{"id":1},{"id":2},{"id":3},{"id":4},{"id":5}]`)
    tokens, err = jsmngo.ParseParallel(largeJSON)
    if err != nil {
        log.Fatalf("Parallel parse error: %v", err)
    }

    fmt.Printf("✓ Parallel parsed %d tokens from array\n", len(tokens))
}

func tokenTypeString(t jsmngo.TokenType) string {
    switch t {
    case jsmngo.Object:
        return "Object"
    case jsmngo.Array:
        return "Array"
    case jsmngo.String:
        return "String"
    case jsmngo.Primitive:
        return "Primitive"
    default:
        return "Unknown"
    }
}