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
4.3 KiB
4.3 KiB
jsonista.clj — Production JSON библиотека за Bara Lang
Моделирана след metosin/jsonista, но с нула Java зависимости.
Защо това е production пример?
Този пример демонстрира пълноценна JSON библиотека с API идентично на jsonista, но:
| JVM jsonista | Bara Lang jsonista | |
|---|---|---|
| JVM зависимост | ✅ Required (JVM + Jackson) | ❌ Няма |
| Jackson/databind | ✅ Required | ❌ Няма |
| GraalVM native-image | ❌ Необходим за бинарен файл | ❌ Не е необходим |
| Бинарен размер | 50MB+ | < 1MB |
| Startup time | Бавен (JVM warmup) | Мигновен |
| Java stdlib | ✅ Required | ❌ Не |
API
; Основни функции
(json/write-value-as-string data) ; -> JSON string
(json/write-value-as-string data opts) ; -> JSON string с опции
(json/read-value json-string) ; -> Bara Lang data
(json/read-value json-string opts) ; -> Bara Lang data с опции
(json/write-value-to-file path data) ; -> записва във файл
(json/write-value-to-file path data opts) ; -> записва във файл
(json/read-value-from-file path) ; -> чете от файл
(json/read-value-from-file path opts) ; -> чете от файл с опции
Опции
| Опция | Тип | Описание |
|---|---|---|
:keyword-keys? |
bool |
При четене, конвертира string ключове към keywords |
:pretty? |
bool |
При писане, форматира JSON с отстъпи |
Примери
Базово encoding/decoding
(def person {:name "Alice" :age 30})
(json/write-value-as-string person)
;; => {"name":"Alice","age":30}
(json/read-value "{\"name\":\"Alice\"}" {:keyword-keys? true})
;; => {:name "Alice"}
Pretty printing
(json/write-value-as-string
{:user {:name "Bob" :roles [:admin :editor]}}
{:pretty? true})
;; =>
;; {
;; "user": {
;; "name": "Bob",
;; "roles": ["admin", "editor"]
;; }
;; }
File I/O
(json/write-value-to-file "data.json" my-data {:pretty? true})
(json/read-value-from-file "data.json" {:keyword-keys? true})
Error handling
(json/read-value "{invalid}")
;; => {:error "input(1, 8) Error: string literal as key expected"}
Как работи?
Вместо Jackson (Java), използваме Nim std/json директно през FFI/runtime слоя:
Clojure code
↓
Bara Lang Compiler
↓
Nim код + cljnim_runtime (std/json)
↓
im c -d:release
↓
Native binary (< 1MB)
Конверсията CljVal ↔ JsonNode се случва в lib/cljnim_runtime.nim:
ckNil→JNullckBool→JBoolckInt→JIntckFloat→JFloatckString/ckKeyword→JStringckVector/ckList→JArrayckMap→JObject
Как да го пуснеш
# Компилиране и изпълнение
./cljnim run examples/jsonista.clj
# Или през Makefile
make check
Реален use-case
Този пример симулира real-world API работа — парсване на HTTP response с nested структури, keyword keys, file persistence и error handling. Перфектно за:
- REST API клиенти
- Конфигурационни файлове
- Data pipelines
- Log агрегация
- Microservices
Сравнение с оригиналния jsonista
| Feature | JVM jsonista | Bara Lang |
|---|---|---|
write-value-as-string |
✅ | ✅ |
read-value |
✅ | ✅ |
| Keyword keys | ✅ | ✅ |
| Pretty print | ✅ | ✅ |
| Custom mapper | ✅ | ✅ (чрез opts map) |
| File I/O | ✅ | ✅ |
| Tagged values | ✅ | Може да се добави |
| Modules (Joda, etc) | ✅ | Не е необходимо |
Извод: С Bara Lang получаваш същото production-ready JSON API, но без целия Java overhead — native бинарен файл, мигновен старт, и достъп до цялата Nim/C ecosystem.