diff options
author | Edward O'Connor <hober0@gmail.com> | 2012-08-21 21:29:22 -0400 |
---|---|---|
committer | Glenn Morris <rgm@gnu.org> | 2012-08-21 21:29:22 -0400 |
commit | 94e0e5592ad531a577f4249564da8688d9d9ebea (patch) | |
tree | 25bebd2bfa1cdacd0f9b83ce33d4fb8d4559a889 /lisp/json.el | |
parent | da485f5e6b5fd38d202a0f6682f6fec28963cf1e (diff) | |
download | emacs-94e0e5592ad531a577f4249564da8688d9d9ebea.tar.gz |
strict key encoding for json.el
Ref: http://lists.gnu.org/archive/html/emacs-devel/2012-08/msg00642.html
* lisp/json.el (json-key-format): Add error properties.
(json-encode-key): New function.
(json-encode-hash-table, json-encode-alist, json-encode-plist):
Use json-encode-key.
Diffstat (limited to 'lisp/json.el')
-rw-r--r-- | lisp/json.el | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/lisp/json.el b/lisp/json.el index 468358ccd1a..f1ee3a52032 100644 --- a/lisp/json.el +++ b/lisp/json.el @@ -174,6 +174,10 @@ this around your call to `json-read' instead of `setq'ing it.") (put 'json-string-format 'error-conditions '(json-string-format json-error error)) +(put 'json-key-format 'error-message "Bad JSON object key") +(put 'json-key-format 'error-conditions + '(json-key-format json-error error)) + (put 'json-object-format 'error-message "Bad JSON object") (put 'json-object-format 'error-conditions '(json-object-format json-error error)) @@ -321,6 +325,15 @@ representation will be parsed correctly." "Return a JSON representation of STRING." (format "\"%s\"" (mapconcat 'json-encode-char string ""))) +(defun json-encode-key (object) + "Return a JSON representation of OBJECT. +If the resulting JSON object isn't a valid JSON object key, +this signals `json-key-format'." + (let ((encoded (json-encode object))) + (unless (stringp (json-read-from-string encoded)) + (signal 'json-key-format (list object))) + encoded)) + ;;; JSON Objects (defun json-new-object () @@ -395,7 +408,7 @@ Please see the documentation of `json-object-type' and `json-key-type'." (maphash (lambda (k v) (push (format "%s:%s" - (json-encode k) + (json-encode-key k) (json-encode v)) r)) hash-table) @@ -409,7 +422,7 @@ Please see the documentation of `json-object-type' and `json-key-type'." (format "{%s}" (json-join (mapcar (lambda (cons) (format "%s:%s" - (json-encode (car cons)) + (json-encode-key (car cons)) (json-encode (cdr cons)))) alist) ", "))) @@ -418,7 +431,7 @@ Please see the documentation of `json-object-type' and `json-key-type'." "Return a JSON representation of PLIST." (let (result) (while plist - (push (concat (json-encode (car plist)) + (push (concat (json-encode-key (car plist)) ":" (json-encode (cadr plist))) result) |