(import (rename (macduffie json) (json-null md-json-null)) (scheme case-lambda) (srfi 1) (srfi 2) (srfi 69)) (begin (define (json-object . pairs) (alist->hash-table pairs)) (define json-list list) (define json-null (md-json-null)) (define (json-object? obj) (or (hash-table? obj) (json-record? obj))) (define json-list? list?) ;; json-null? already defined in macduffie json (define (json-object-contains-key? obj key) (or (and (hash-table? obj) (hash-table-exists? obj key)) (and (json-record? obj) (json-object-contains-key? ((json-record->typeless obj)) key)))) (define string->json json-read-string) (define (json->string j) (json-write-string (json->typeless-json j))) (define (json-object-ref j key) (cond ((hash-table? j) (if (hash-table-exists? j key) (hash-table-ref j key) ((json-key-not-found)))) ((json-record? obj) (or (and-let* ((pair (assoc key (json-record->accessors obj))) (accessor (cdr pair))) (accessor (json-record->internal-record obj)) obj) (error "json-object-ref: no accessor for field" (json-record->name obj) key))) (else ((json-key-not-found))))) (define (json-object-set! obj key value) (cond ((hash-table? obj) (hash-table-set! obj key value) obj) ((json-record? obj) (or (and-let* ((pair (assoc key (json-record->mutators obj))) (mutator! (cdr pair))) (mutator! (json-record->internal-record obj) value) obj) (error "json-object-set!: no mutator for field" (json-record->name obj) key))))) (define json-list-ref list-ref) (define json-list-length length) (define (json-object-map proc obj) (let ((res (json-object))) (hash-table-walk obj (lambda (key value) (call-with-values (lambda () (proc key value)) (case-lambda ((key value) (hash-table-set! res key value)) (_ (error "json-object-map: proc did not return two values")))))) res)) (define json-list-map map) (define (json-object->alist obj) (cond ((hash-table? obj) (hash-table->alist obj)) ((json-record? obj) (json-object->alist (json->typeless-json obj))) (else (error "json-object->alist: not an object" obj)))) (define json-list->list values))