(import (rename (chibi json) (json->string base:json->string)) (scheme case-lambda) (srfi 1) (srfi 2)) (begin (define json-object list) (define json-list vector) (define json-null (string->json "null")) (define (json-object? obj) (or (list? obj) (json-record? obj))) (define json-list? vector?) (define (json-object-contains-key? obj key) (or (and (list? obj) (assoc key obj) #t) (and (json-record? obj) (json-object-contains-key? (json-record->fields obj) key)))) (define (json-null? obj) (eq? obj json-null)) (define (json->string json) (base:json->string (json->typeless-json json))) ;; string->json already defined in chibi json (define (json-object-ref json key) (cond ((list? json) (let ((pair (assoc key json))) (if pair (cdr pair) ((json-key-not-found))))) ((json-record? json) (json-object-ref (json-record->fields json) key)) (else ((json-key-not-found))))) (define (json-object-set! json key value) (cond ((and (list? json) (json-object-contains-key? json key)) (set-cdr! (assoc key json) value) json) ((null? json) (json-object (cons key value))) ((list? json) (append! json (list (cons key value)))) ((json-record? json) (or (and-let* ((pair (assoc key (json-record->mutators json))) (mutator (cdr pair))) (mutator json value)) (error "json-object-set!: no mutator for field" (json-record->name json) key))))) (define json-list-ref vector-ref) (define json-list-length vector-length) (define (json-object-map proc json) (map (lambda (pair) (call-with-values (lambda () (proc (car pair) (cdr pair))) (case-lambda ((key value) (cons key value)) (_ (error "json-object-map: proc did not return two values"))))) json)) (define json-list-map vector-map) (define (json-object->alist json) (cond ((list? json) json) ((json-record? json) (json-record->fields json)) (else (error "json-object->alist: not an object" json)))) (define json-list->list vector->list))