44 lines
1.2 KiB
Common Lisp
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)))
|