(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)))