79cd9c08d8
- Bulk replace Clojure/Nim → Bara Lang in src/, lib/, examples/, benchmarks/, experiments/, books/, LICENSE, cljnim.nimble, PLAN.md, AI_AGENT.md - Rename book chapters: 05-clojure-nim.md → 05-bara-lang.md (en + bg) - Update all chapter index links and anchors - Replace project-specific 'Clojure' references with 'Bara Lang' in experiments/, src/ai_assist.nim, src/tui_screens.nim, src/emitter.nim, src/reader.nim, src/types.nim, lib/cljnim_runtime*.nim - Keep legitimate JVM Clojure/ClojureScript/Clojure CLR references intact
134 lines
4.5 KiB
Clojure
134 lines
4.5 KiB
Clojure
; jsonista.clj — Production JSON library example for Bara Lang
|
|
; Modeled after https://github.com/metosin/jsonista
|
|
; Replaces Java/Jackson dependencies with native Nim JSON performance
|
|
;
|
|
; This example demonstrates:
|
|
; - Fast JSON encoding/decoding without JVM overhead
|
|
; - Keyword keys support (Bara Lang idiomatic)
|
|
; - File I/O
|
|
; - Pretty printing
|
|
; - Complex nested data structures
|
|
; - Error handling
|
|
; - Performance demonstration
|
|
|
|
(println "=== jsonista.clj — Production JSON Example ===")
|
|
(println "Zero Java dependencies — pure native Nim performance\n")
|
|
|
|
; ---- Basic Encoding ----
|
|
|
|
(println "=== Basic Encoding ===")
|
|
(def basic {:hello 1})
|
|
(println (json/write-value-as-string basic))
|
|
|
|
(println "\n=== Keyword Keys Encoding ===")
|
|
(def person {:name "Alice" :age 30 :active true})
|
|
(println (json/write-value-as-string person))
|
|
|
|
(println "\n=== Complex Nested Data ===")
|
|
(def nested-data
|
|
{:user {:name "Bob"
|
|
:roles [:admin :editor]
|
|
:settings {:theme "dark" :notifications true}}
|
|
:metrics [42 3.14 100]
|
|
:metadata nil})
|
|
|
|
(println (json/write-value-as-string nested-data))
|
|
|
|
; ---- Decoding ----
|
|
|
|
(println "\n=== Basic Decoding ===")
|
|
(def json-str "{\"hello\": 1, \"world\": \"test\"}")
|
|
(println (json/read-value json-str))
|
|
|
|
(println "\n=== Decoding with Keyword Keys ===")
|
|
(println (json/read-value json-str {:keyword-keys? true}))
|
|
|
|
(println "\n=== Decoding Arrays ===")
|
|
(def arr-json "[{\"id\":1,\"name\":\"A\"},{\"id\":2,\"name\":\"B\"}]")
|
|
(println (json/read-value arr-json {:keyword-keys? true}))
|
|
|
|
; ---- Pretty Printing ----
|
|
|
|
(println "\n=== Pretty Printing ===")
|
|
(println (json/write-value-as-string nested-data {:pretty? true}))
|
|
|
|
; ---- File I/O ----
|
|
|
|
(println "\n=== File I/O ===")
|
|
(def test-file "examples/nimcache/jsonista_test.json")
|
|
|
|
; Write to file
|
|
(json/write-value-to-file test-file nested-data {:pretty? true})
|
|
(println "Wrote to" test-file)
|
|
|
|
; Read back
|
|
(println "Read back:")
|
|
(println (json/read-value-from-file test-file {:keyword-keys? true}))
|
|
|
|
; Verify roundtrip
|
|
(println "\n=== Roundtrip Verification ===")
|
|
(println "Original name:" (get (get nested-data :user) :name))
|
|
(println "Roundtrip name:" (get (get (json/read-value-from-file test-file {:keyword-keys? true}) :user) :name))
|
|
(println "Match?" (= (get (get nested-data :user) :name)
|
|
(get (get (json/read-value-from-file test-file {:keyword-keys? true}) :user) :name)))
|
|
|
|
; ---- Error Handling ----
|
|
|
|
(println "\n=== Error Handling ===")
|
|
(def bad-json "{invalid json}")
|
|
(def result (json/read-value bad-json))
|
|
(println "Parse error result:" result)
|
|
|
|
; ---- Real-world API Response Simulation ----
|
|
|
|
(println "\n=== API Response Simulation ===")
|
|
(def api-response
|
|
{:status 200
|
|
:headers {"Content-Type" "application/json"
|
|
"X-Request-ID" "abc-123"}
|
|
:body {:users [{:id 1 :username "alice" :email "alice@example.com"}
|
|
{:id 2 :username "bob" :email "bob@example.com"}]
|
|
:total 2
|
|
:page 1
|
|
:per-page 10}})
|
|
|
|
(def api-json (json/write-value-as-string api-response {:pretty? true}))
|
|
(println api-json)
|
|
|
|
; Parse it back
|
|
(def parsed-api (json/read-value api-json {:keyword-keys? true}))
|
|
(println "Parsed API status:" (get parsed-api :status))
|
|
(println "First user:" (first (get (get parsed-api :body) :users)))
|
|
|
|
; ---- Custom Mapper Example ----
|
|
|
|
(println "\n=== Custom Mapper Example ===")
|
|
(defn make-mapper [opts]
|
|
opts)
|
|
|
|
(def custom-mapper (make-mapper {:keyword-keys? true :pretty? true}))
|
|
(println "Custom mapper output:")
|
|
(println (json/write-value-as-string {:config {:debug true :port 8080}} custom-mapper))
|
|
|
|
; ---- Performance Demonstration ----
|
|
|
|
(println "\n=== Performance Demonstration ===")
|
|
(def bench-data
|
|
{:timestamp "2024-01-15T10:30:00Z"
|
|
:events [{:id 0 :type "click" :value 0.0 :tags ["tag-0" "cat-0"]}
|
|
{:id 1 :type "view" :value 0.5 :tags ["tag-1" "cat-1"]}
|
|
{:id 2 :type "click" :value 1.0 :tags ["tag-2" "cat-2"]}
|
|
{:id 3 :type "view" :value 1.5 :tags ["tag-3" "cat-3"]}
|
|
{:id 4 :type "click" :value 2.0 :tags ["tag-4" "cat-4"]}]})
|
|
|
|
; Single encode/decode to show it works fast
|
|
(def json-bench (json/write-value-as-string bench-data))
|
|
(def parsed-bench (json/read-value json-bench {:keyword-keys? true}))
|
|
(println "Bench data encoded/decoded successfully")
|
|
(println (str "Data size: " (count json-bench) " chars"))
|
|
(println "First event type:" (get (first (get parsed-bench :events)) :type))
|
|
|
|
(println "\n=== jsonista.clj complete ===")
|
|
(println "This example shows production-ready JSON handling")
|
|
(println "with zero Java dependencies — pure native performance.")
|