cl-matrix/src/json.lisp
2025-03-13 00:31:01 -07:00

44 lines
1.2 KiB
Common Lisp

(in-package :cl-matrix)
(defun plist-json (plist)
(jzon:stringify (plist-hash-table-recurse plist)))
(defun plist-p (l)
(and (listp l) (evenp (length l)) (keywordp (first l))))
(defun plist-hash-table-recurse (element)
(cond
(
(plist-p element)
(let (result)
(alex:doplist (key val element result)
(push (plist-hash-table-recurse val) result)
(push key result))
(alex:plist-hash-table result)))
(
(listp element)
(mapcar 'plist-hash-table-recurse element))
(t element)))
(defun hash-table-plist-recurse (element)
(cond
(
(hash-table-p element)
(let ((result))
(maphash (lambda (key val)
(push (hash-table-plist-recurse val) result)
(push (alex:make-keyword (string-upcase key)) result))
element)
result))
(
(and (vectorp element) (not (stringp element)))
(map 'list 'hash-table-plist-recurse element))
(t element)))
(defun json-plist (json)
(let ((parsed (handler-case
(jzon:parse json)
(error ()
(error 'not-json-error)))))
(hash-table-plist-recurse parsed)))