/src/yason.lisp

http://github.com/sykopomp/chillax · Lisp · 45 lines · 40 code · 5 blank · 0 comment · 0 complexity · 666e7ec7267d3154db6c62413de5e708 MD5 · raw file

  1. (defpackage #:chillax.yason
  2. (:use :cl :chillax.core)
  3. (:export :yason-server))
  4. (in-package :chillax.yason)
  5. (defgeneric parse-json-arrays-as-vectors-p (server))
  6. (defgeneric parse-json-booleans-as-symbols-p (server))
  7. (defgeneric parse-object-as-alist-p (server))
  8. (defgeneric parse-object-key-fun (server))
  9. (defclass yason-server (standard-server)
  10. ((array-as-vector-p
  11. :initarg :array-as-vector-p
  12. :reader parse-json-arrays-as-vectors-p)
  13. (boolean-as-symbol-p
  14. :initarg :boolean-as-symbol-p
  15. :reader parse-json-booleans-as-symbols-p)
  16. (object-as-alist-p
  17. :initarg :object-as-alist-p
  18. :reader parse-object-as-alist-p)
  19. (parse-object-key-fun
  20. :initarg :parse-object-key-fun
  21. :reader parse-object-key-fun))
  22. (:documentation
  23. "YASON-SERVERs use Yason's JSON parser/encoder to automatically translate content going to/coming
  24. from the associated CouchDB server.")
  25. (:default-initargs
  26. :array-as-vector-p nil
  27. :boolean-as-symbol-p nil
  28. :object-as-alist-p nil
  29. :parse-object-key-fun #'identity))
  30. (defmethod data->json ((server yason-server) data &key)
  31. (with-output-to-string (s)
  32. (if (parse-object-as-alist-p server)
  33. (yason:encode-alist data s)
  34. (yason:encode data s))))
  35. (defmethod json->data ((server yason-server) json &key)
  36. (yason:parse json
  37. :object-key-fn (parse-object-key-fun server)
  38. :object-as (if (parse-object-as-alist-p server) :alist :hash-table)
  39. :json-booleans-as-symbols (parse-json-booleans-as-symbols-p server)
  40. :json-arrays-as-vectors (parse-json-arrays-as-vectors-p server)))